我找到了以下代码,用于使用第一个,最后一个和中间元素的中位数来查找快速排序的数据透视:
int middle = ( low + high ) / 2;
if( a[ middle ].compareTo( a[ low ] ) < 0 )
swapReferences( a, low, middle );
if( a[ high ].compareTo( a[ low ] ) < 0 )
swapReferences( a, low, high );
if( a[ high ].compareTo( a[ middle ] ) < 0 )
swapReferences( a, middle, high );
// Place pivot at position high - 1
swapReferences( a, middle, high - 1 );
Comparable pivot = a[ high - 1 ];
我想知道找到中位数后,为什么用指数high-1而不是高指数进行交换?
答案 0 :(得分:1)
原因是算法不仅找到中位数,还对低,中,高元素进行排序。在三种排列之后,你知道[中]&lt; = 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; //Wrong
int middle = ( low + high ) >>> 1; //Correct
原因是如果(低+高)大于Integer.MAX_VALUE,您将有溢出,中间将是负数。第二行总会给你一个积极的结果。