Quicksort超出范围Kotlin

问题描述

我正在尝试在Kotlin中实现quicksort。

我总是越界错误,但我不知道为什么。

下面是我的代码

fun quicksort(arr: MutableList<Int>) {
    quicksortHelper(arr,arr.size + 1)
}

fun quicksortHelper(arr: MutableList<Int>,low: Int,high: Int) {
    if (low < high) {
        val partitionIdx = partition(arr,low,high)
        quicksortHelper(arr,partitionIdx)
        quicksortHelper(arr,partitionIdx + 1,high)
    }
}

fun partition (arr: MutableList<Int>,high: Int): Int {
    val pivot = arr[low]
    var i= low
    var j = high
    while (i < j) {
        do {
            i++
        } while (arr[i] <= pivot)
        do {
            j--
        } while (arr[j] > pivot)
        if (i < j) {
            val temp = arr[i]
            arr[i] = arr[j]
            arr[j] = temp
        }
    }
    val temp = arr[low]
    arr[low] = arr[j]
    arr[j] = temp

    return j
}

解决方法

quicksort中,您可能想以arr.size - 1的高位开始。那是:

fun quicksort(arr: MutableList<Int>) {
    quicksortHelper(arr,arr.size - 1)
}

除此之外,看来您的数据透视方法存在一些问题,并且在索引编制中存在一些不一致之处。您想以i = low - 1j = high + 1开头,否则将跳过数组的第一个和最后一个元素。除了上述更改之外,还向您的partition函数添加以下更改可以解决您的问题:

fun partition (arr: MutableList<Int>,low: Int,high: Int): Int {
    val pivot = arr[(high + low) / 2] // pivot at the middle element instead of `low`
    var i = low - 1
    var j = high + 1
    while (i < j) {
        do {
            i++
        } while (arr[i] < pivot)
        do {
            j--
        } while (arr[j] > pivot)
        if (i < j) {
            val temp = arr[i]
            arr[i] = arr[j]
            arr[j] = temp
        }
    }
    val temp = arr[low]
    arr[low] = arr[j]
    arr[j] = temp

    return j
}

有关更多详细信息,请参见wikipedia quicksort page上的“ Hoarse Partition Scheme”伪代码。