快速排序分区过程(Lomuto)中的交换条件?

时间:2019-06-02 13:27:53

标签: algorithm sorting quicksort

我已经从算法入门一书中实现了快速排序。本书指定了以下步骤

enter image description here

但是我看不到第4行小于等于比较的要求,不应该不仅仅小于比较就够了

为进行检查,我编写了以下程序,并且该程序可以正确处理我测试过的数据集。

private fun partition(start: Int, end: Int, arr: Array<Int>) : Int{
        var pivotIndex = end
        var maximumElementIndex = start
        for(index in start until end){
            if(arr[index]<arr[pivotIndex]){
                val temp = arr[index]
                arr[index] = arr[maximumElementIndex]
                arr[maximumElementIndex] = temp
                maximumElementIndex++
            }
        }

        val temp = arr[maximumElementIndex]
        arr[maximumElementIndex] = arr[pivotIndex]
        arr[pivotIndex] = temp
        return maximumElementIndex
    }

我已经在以下输入上对其进行了测试

  • 具有相等元素的数组
  • 排序数组
  • 反向排序
  • 多个随机数据集

那我在这里想念什么?

1 个答案:

答案 0 :(得分:0)

与使用<=相比,差异更大。它还正在初始化i = p-1;,最后的交换是swap(A[i+1], A[r]);。这只是Lomuto分区方案的一种变体。您的示例代码与Wiki文章中的代码匹配:

https://en.wikipedia.org/wiki/Quicksort#Lomuto_partition_scheme

请注意,对于已排序的数据,反向排序的数据和所有相等的元素,这两种方案都是最坏的情况,因为在每次递归级别下,分区只会将分区的大小减小1。使用中间值作为支点并将其交换到末尾可解决排序或反向排序数据的问题,但是Lomuto通常随着相等元素数量的增加而变得更糟。

使用中间元素的Hoare方案通常随着重复项数量的增加而变得更好。不需要交换等于枢轴值的元素,但是随着重复项数量的增加,分区接近了均匀大小拆分的理想情况,而缓存有助于进行不必要的交换。

https://en.wikipedia.org/wiki/Quicksort#Hoare_partition_scheme