快排原理介绍
在数组s中随便选出一数,做为枢纽值x。
s1和s2
大小不必相等。递归的向s1和s2使用上面的方法,结合起来就拍好序了。
注意:
在实际应用中数组的数量小于20,插入排序的速度快与快速排序。
java实现
public class QuickSort {
private final int CUTOFF = 20;
void quicksort( int[] list) {
quicksort( list, 0, list.length - 1);
}
void quicksort( int[] list, int left, int right) {
if (left + CUTOFF <= right)
{
//得到枢纽元
int pivot = median3(list, left, right);
int i = left;
int j = right-1;
for( ; ; )
{
//当俩个指针都停下时,进行交换
while ( list[++i] < pivot) {}
while ( list[--j] > pivot) {}
//检查是否越界
if (i < j)
swap(list, i, j);
else
break;
}
//将枢纽元放回i所在位置
swap(list, i, right - 1);
//递归调用
quicksort( list, left, i - 1);
quicksort( list, i+ 1, right);
}
else
inserSort( list, left, right);
}
//将首尾中3个数进行排序并返回中值
int median3( int[] list, int left, int right) {
int center = (left + right ) / 2;
//若center值小于left值,二者交换
if (list[center] < list[left])
swap( list, left, center);
//若right值小于left值,二者交换
if (list[right] < list[left])
swap( list, left, right);
//若right值小于center值,二者交换
if (list[right] < list[center])
swap( list, center, right);
//最终结果为left, center,right值从小到大排列
//将中值于倒数第二个值交换
swap( list, center, right-1);
//返回中值
return list[ right - 1 ];
}
//交换数组中的位置
void swap( int[] list, int left, int right) {
int temp = list[left];
list[left] = list[right];
list[right] = temp;
}
//直接插入排序,由小到大
void inserSort( int[] list, int left, int right) {
int j;
for( int p = left; p <= right; p++ ) {
int temp = list[p];
//比较当前位置与前面一个的大小, 如果当前位置较小与前一个交换。
for ( j = p; j > 0 && temp - list[ j - 1] < 0; j--)
list[j] = list[j-1];
list[j] = temp;
}
}
}