정렬알고리듬은 아무리빨라도 O(N)보다 느릴 수 밖에 없다..!
O(N) < O(N log N) < O(N^2)
퀵의 경우 스택메모리를 사용
val i = left
for(j in left until right) {
if(arr[j] < pivot) {
swap(arr, i, j)
++i
}
}
val pivotPos = partition(arr, left, right)
quickSortHelper(arr, left, pivotPos - 1)
quickSortHelper(arr, pivotPos + 1, right)
fun quickSort(arr:Array<Int>) {
return quickSortHelper(arr, 0, arr.size - 1)
}
fun quickSortHelper(arr: Array<Int>, left: Int, right: Int) {
if(left >= right) return
val pivotPos = partition(arr, left, right)
quickSortHelper(arr, left, pivotPos - 1)
quickSortHelper(arr, pivotPos + 1, right)
}
fun partition(arr: Array<Int>, left: Int, right: Int) : Int{
val pivot = arr[right]
var i = left
for(j in left until right) {
if(arr[j] < pivot) {
swap(arr, i, j)
++i
}
}
val pivotPos = i
swap(arr, pivotPos, right)
return pivotPos
}
fun swap(arr: Array<Int>, a: Int, b: Int){
val tmp = arr[a]
arr[a] = arr[b]
arr[b] = tmp
}
코틀린 코드로 좀 더 자세히 살펴보자면...!
전체 코드
fun mergeSort(arr: ArrayList<Int>) {
if(arr.size <= 1) return
val mid = arr.size / 2
val left = ArrayList(arr.subList(0, mid))
val right = ArrayList(arr.subList(mid, arr.size))
mergeSort(left)
mergeSort(right)
mergeArray(arr, left, right)
}
fun mergeArray(arr: ArrayList<Int>, arr1: ArrayList<Int>, arr2: ArrayList<Int>){
var i = 0 // arr1의 index를 가리킴
var j = 0 // arr2의 index를 가리킴
var k = 0 // arr의 index를 가리킴
while(i < arr1.size && j < arr2.size) {
// 오름차순 정렬
if(arr1[i] <= arr2[j]){
arr[k] = arr1[i]
++i
++k
}
else {
arr[k] = arr2[j]
++j
++k
}
}
// arr1.size > arr2.size인 경우
while( i < arr1.size) {
arr[k] = arr1[i]
++i
++k
}
// arr1.size < arr2.size인 경우
while(j < arr2.size){
arr[k] = arr2[j]
++j
++k
}
}
본 내용은 Udemy의 알고리듬 및 자료구조(Java)강의를 듣고 정리한 내용입니다.