관리 메뉴

오늘도 더 나은 코드를 작성하였습니까?

Algorithm(알고리즘) 퀵 정렬(quick sort) 정리 feat. kotlin 본문

카테고리 없음

Algorithm(알고리즘) 퀵 정렬(quick sort) 정리 feat. kotlin

hik14 2023. 8. 17. 17:33

퀵 정렬(quick sort)은 기준키를 기준으로 작거나 같은 값을 지닌 데이터는 앞으로, 큰 값을 지닌 데이터는 뒤로 가도록 하여 작은 값을 갖는 데이터와 큰 값을 갖는 데이터로 분리해가며 정렬하는 방법이다.

 

기준키(pivot)은 임의 원소를 잡으면된다. 일반적으로 제일 처음에 있는 원소 또는 가장 중간에 있는 원소를 잡는다.

여기서는 제일 처음에 있는 원소를 잡도록 구현한다.

 

/*
    퀵 정렬

     기준키(피벗)를 기준으로
     작거나 같은 값을 지닌 데이터는 앞으로, 큰 값을 지닌 데이터는 뒤로 가도록 한다.

     재귀적 방법을 이용하여 구현한다.

     평균적인 시간복잡도는 O(N * logN)
     최약의 경우 O(N^2)

 */

val arr = intArrayOf(10, 1, 5, 3, 2, 4, 7, 9, 8, 6)

fun swap(a: Int, b: Int) {
    val temp = arr[a]
    arr[a] = arr[b]
    arr[b] = temp
}

fun quickSort(start: Int, end: Int) {
    // 파티션 원소 개수가 1개일 경우.
    if (start >= end) return

    val pivot = start
    var l = start + 1
    var r = end

    while (l <= r) {
        while (l <= end && arr[l] <= arr[pivot]) { // pivot 보다 큰 idx 찾기
            l += 1
        }
        while (r > start && arr[r] >= arr[pivot]) { // pivot 보다 작은 idx 찾기
            r -= 1
        }

        // 자리 바꾸기.
        if (l > r) {
            swap(pivot, r)
        } else {
            swap(l, r)
        }
    }

    quickSort(start, r - 1)
    quickSort(r + 1, end)
}

fun main() {

    quickSort(0, arr.lastIndex)
    println(arr.joinToString(" "))
}