传统的快速排序是目前性能最快的排序方法,其在平均情况下的时间复杂度为O(nlogn,)但快速排序性能不稳定,在已经排好序或接近排好序的情况下时间复杂度为O(n*n),分析其原因在于其总是选取序列的第一个元素作为枢轴,而其右侧总是比枢轴大的数,所以一轮下来只能排一个数,所以采用随机数算法讲序列任意一个数与第一个数交换,再把第一个数作为枢轴进行排序。
具体代码如下(以整型数组排序为例):
public 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);
}
}
public static void partition(int a[],int p,int r){
int rand = (int)(Math.Random()*(r-p));
swap(a,p,p+rand);
int x = a[p];
int j = r+1;
int i = p;
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 swap(int a[],int i,int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}