快速排序,枢纽元(比较值)理论上选哪个都可以。实际快速排序包括划分策略 和递归调用。
public static <AnyType extends Comparable<? super AnyType>>
void quicksort(AnyType [] a)
{
quicksort(a, 0, a.length-1);
}
private static final int CUTOFF= 3;
public static <AnyType> void swapReferences(AnyType [] a, int index1, int index2)
{
AnyType tmp= a[index1];
a[index1]= a[index2];
a[index2]= tmp;
}
private static <AnyType extends Comparable<? super AnyType>>
AnyType median3(AnyType [] a, int left, int right)
{
//left, center, right 上的元素从小到大
int center= (left+right)/2;
if(a[center].compareTo(a[left])< 0)
swapReferences(a, left, center);
if(a[right].compareTo(a[left] < 0))
swapReferences(a, left, right);
if(a[right].compareTo(a[center]) < 0)
swapReferences(a, center, right);
//center(pivot)放到right-1位置
swapReferences(a, center, right-1);
return a[right-1];
}
private static <AnyType extends Comparable<? super AnyType>> void quicksort(AnyType [] a, int left, int right)
{
if(left+CUTOFF <= right);
{
AnyType pivot= median3(a, left, right);
//Begin partitioning
int i= left, j= right-1;
for(;;)
{
//++前缀操作符能保证比较前,推进,若是后缀运算符,当a[i]=a[i]=pivot 时出现死循环
while(a[++i].compareTo(pivot) < 0) {}
while(a[--j].compareTo(pivot) > 0) {}
if(i < j)
swapReferences(a, i, j);
else
break; //i 不可能等于j, 因为上面两个while语句 互斥, i和j不可能指向同一个位置。
}
//restore pivot
swapReferences(a, i, right-1);
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
else
insertionSort(a, left, right);
}