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”伪代码。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...