3分区的中位数

时间:2012-10-30 17:28:23

标签: java algorithm sorting quicksort

我找到了以下代码,用于使用第一个,最后一个和中间元素的中位数来查找快速排序的数据透视:

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而不是高指数进行交换?

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,您将有溢出,中间将是负数。第二行总会给你一个积极的结果。