问题描述
我正在尝试在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 - 1
和j = 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”伪代码。