【发布时间】:2013-10-23 02:53:38
【问题描述】:
我试图用 3 的中位数分区来理解快速排序。在找到数组中第一个、中间和最后一个元素的中值后,一种常见的做法是将中值与数组中倒数第二个元素交换(第 n-1 个索引)。我们这样做有什么特别的原因吗?
【问题讨论】:
标签: quicksort
我试图用 3 的中位数分区来理解快速排序。在找到数组中第一个、中间和最后一个元素的中值后,一种常见的做法是将中值与数组中倒数第二个元素交换(第 n-1 个索引)。我们这样做有什么特别的原因吗?
【问题讨论】:
标签: quicksort
原因是该算法不仅找到中位数,还对低、中、高元素进行排序。在三个排列之后,您知道 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 为负数。第二行总是会给你一个积极的结果。
【讨论】: