我试图理解快速排序,中位数为3的分区。在找到数组中第一个,中间和最后一个元素的中位数后,通常的做法是将中位数与数组中的倒数第二个元素(第n个第1个索引)进行交换。我们这样做的具体原因是什么?
答案 0 :(得分:0)
原因是算法不仅找到中位数,还对低,中,高元素进行排序。在三种排列之后,你知道[中]< = a [high]。所以你只需要在高位之前对元素进行分区,因为[high]大于或等于pivot。
让我们看一个例子:low = 0,middle = 4和high = 8。你的数组是这样的:
lowerOrEqualToPivot X X X pivot X X X greaterOrEqualToPivot
如果你将中间换成高,你需要在括号之间划分8个元素:
[lowerOrEqualToPivot X X X greaterOrEqualToPivot X X X] pivot
如果你用high-1替换中间,你需要只拆分7个元素:
[lowerOrEqualToPivot X X X X X X] pivot greaterOrEqualToPivot
顺便说一句,第一行有一个错误:
int middle =(low + high)/ 2; //错误 int middle =(低+高)>>> 1; //正确
原因是如果(低+高)大于Integer.MAX_VALUE,您将有溢出,中间将是负数。第二行总会给你一个积极的结果。