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

标签 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
    }

我已经根据以下输入对其进行了测试

  • 所有元素相等的数组
  • 排序数组
  • 倒序排列
  • 多个随机数据集

所以我在这里缺少什么?

最佳答案

除了使用 <= 之外,还有更多差异.它还在初始化 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

关于algorithm - 快速排序分区程序(Lomuto)中的交换条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56415486/

相关文章:

php - 按特定顺序对数组进行排序

C++ 为几乎相同的代码提供不同的输出

java - 递归调用溢出堆栈

algorithm - 如何检测照片的对比度?

c++ - 使用子串比较的两个字符串集之间的交集

algorithm - 算法训练阶段的健全性检查

java - 在无向图中查找所有循环

Python-Pandas : How to sort a pivot table maintaining one column grouped

c - 链表的具体排序

c - qsort 中的比较函数是如何工作的?