fun main() {
    val arr = intArrayOf(3, 2, 5, 1, 4)
    quickSort(arr, 0, arr.size - 1)
    println(arr.contentToString())
}

// 배열을 퀵 정렬 방식으로 정렬하는 함수
fun quickSort(arr: IntArray, start: Int, end: Int) {
    if (start < end) {
        val pivot = partition(arr, start, end)
        quickSort(arr, start, pivot - 1) // 피벗 왼쪽 부분 배열 정렬
        quickSort(arr, pivot + 1, end) // 피벗 오른쪽 부분 배열 정렬
    }
}

// 파티션 함수: 배열을 피벗을 기준으로 두 부분으로 나눔
fun partition(arr: IntArray, start: Int, end: Int): Int {
    val pivot = arr[end] // 피벗을 배열의 마지막 요소로 지정
    var i = start - 1 // 피벗보다 작은 요소들의 인덱스를 추적

    for (j in start until end) {
        // 현재 요소가 피벗보다 작으면
        if (arr[j] < pivot) {
            i++ // 'i'를 증가시키고
            // arr[i]와 arr[j]를 스왑
            arr[i] = arr[j].also { arr[j] = arr[i] }
        }
    }
    // 피벗을 중간으로 이동
    arr[i + 1] = arr[end].also { arr[end] = arr[i + 1] }
    return i + 1 // 새로운 피벗의 위치 반환
}