算法特点,以某个记录为界(该记录称为支点活枢轴),将待排序列分成两部分:一部分大于等于支点记录的关键字,另一部分小于支点记录的关键字。意思就是每次排完一趟,左边的比枢轴小,右边的比枢轴大。游标high用于搜索比枢轴小的记录,游标low用于搜索比枢轴大的记录,搜索就和枢轴交换并切换游标。 大概意思就是把数组分为两个子数组和一个元素,在子数组当中继续进行,递归操作。在ACM使用的快排中,我们确定枢轴,我们让左边比枢轴大的,右边比枢轴小的交换,最后当左边游标和右边游标碰头的时候,就将枢轴和此位置的元素交换,这样枢轴值交换了一次,从而进行了优化。为了防止因为有序而每次只能排一个元素和一个子数组,我们用一个随机数来确定枢轴交换到第一个元素的位置,从而减少了因为有序而引发的效率底的概率。我们要注意两个数值交换,不要冲掉数,借用第三变量来实现交换。枢轴我们定义一个变量等于它,交换的时候就比较方便了。
package cn.hncu.sorts;
public class SortWay2 {
//输出函数
private static void print(int[] a) {
for(int num:a){
System.out.print(num+" ");
}
System.out.println();
}
//交换数组位置函数
private static void swap(int[] a, int j, int i) {
int temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
//quickSort
private static void quickSort(int[] a, int p, int r) {
if(p<r){
//把数组划分成两个子数组和一个元素
int q=partition(a,p,r);
quickSort(a, p, q-1);
quickSort(a, q+1, r);
}
}
private static int partition(int[] a, int p, int r) {
//快排的优化----随机选取数列中的一个元素当作枢轴---交换到第1个元素的位置
int rand=(int)(Math.random()*(r-p));
swap(a, p, p+rand);
int x=a[p];//第1个元素为枢轴
int i=p;//在左侧搜索的游标:找大
int j=r+1;//在右侧搜索的游标:找小
while(true){
while(a[++i]<x && i<r);//在左侧定位到比枢轴大的数
while(a[--j]>x);//在右侧定位到比枢轴小的数
if(i>=j){
break;
}
swap(a, i, j);
}
//把枢轴换到小值区的最后一个元素的位置
swap(a,p,j);
return j;
}
public static void main(String[] args) {
int[] a={21,22,5,7,86,57,9,-2,37,-8};
//快速排序
// quickSort(a,0,a.length-1);
print(a);
}
}
代码实现如下: