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

快速排序

2015-10-10 16:12 429 查看
edit version : 2017-3-5

最近在全面阅读排序算法,对之前的快速排序博文做下补充优化。

由于是借鉴csdn,cnblogs等多个博文,在此注明转载,不一一列举。

//quick sort
//交换子表的记录,使枢轴记录到位,并返回枢轴所在的位置
private static int Partition(int array[], int low, int high){

/*三数中值分割法*/
int m = low + (high - low) / 2;//数组中间元素的下标
if (array[low]>array[high]) //保证左端较小
swap(array, low, high);
if (array[m] > array[high]) //保证中间较小
swap(array, high, m);
if (array[m] > array[low])
swap(array, m, low); //保证左端最小
//此时array[low]已经为整个序列左中右三个关键字的中间值
int pivotkey = array[low];

/*固定基准元
int pivotkey = array[low];
*/

/*随机基准元
int randomIndex = rand() % (high - low) + low;//取数组中随机下标
swap(array, randomIndex, low); //与第一个数交换
int pivotkey = array[low];
*/

int i = low, j = high;
while(i<j) //从表的两端交替向中间扫描,当没有相遇
{
while (array[j] >= pivotkey&&i<j){
j--;
}
while (array[i] <= pivotkey&&i<j){
i++;
}
if (i<j)
{
swap(array, i, j);
}
}
//最终将基准数归位
swap(array, low, i);
return i; //返回枢轴所在的位置
}
private static void qSort(int array[], int low, int high){
int pivot;
if (low<high)
{
pivot = Partition(array, low, high);//算出枢轴值
qSort(array, low, pivot - 1); //对低子表递归排序
qSort(array, pivot + 1, high); //对高子表递归排序
}
}
//对array做快速排序
public static int[] quickSort(int array[]){
qSort(array, 0, array.length-1);
return array;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 排序