您的位置:首页 > 编程语言 > Java开发

算法实战java实现快速排序

2017-10-22 16:03 681 查看

快排原理介绍



在数组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;
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: