【问题标题】:Media-of-3 partitioning in QuickSortQuickSort 中的 Media-of-3 分区
【发布时间】:2013-10-23 02:53:38
【问题描述】:

我试图用 3 的中位数分区来理解快速排序。在找到数组中第一个、中间和最后一个元素的中值后,一种常见的做法是将中值与数组中倒数第二个元素交换(第 n-1 个索引)。我们这样做有什么特别的原因吗?

【问题讨论】:

标签: quicksort


【解决方案1】:

原因是该算法不仅找到中位数,还对低、中、高元素进行排序。在三个排列之后,您知道 a[middle]

让我们看一个例子:low=0、middle=4 和 high=8。你的数组是这样的:

lowerOrEqualToPivot X X X pivot X X X greaterOrEqualToPivot

如果将中间与高交换,则需要将括号内的8个元素分开:

[ lowerOrEqualToPivot X X X greaterOrEqualToPivot X X X ] 枢轴

如果用high-1交换middle,只需要拆分7个元素:

[ lowerOrEqualToPivot X X X X X X ] 枢轴更大OrEqualToPivot

顺便说一下第一行有个bug:

int 中间 = ( 低 + 高 ) / 2; //错误的 int 中间 = ( 低 + 高 ) >>> 1; //正确

原因是,如果 (low + high) 大于 Integer.MAX_VALUE,则会出现溢出,而 middle 为负数。第二行总是会给你一个积极的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 2020-09-20
    相关资源
    最近更新 更多