快速排序(Quick Sort)的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。我们学的快排大概都是这样:
int part(int a[],int low,int high){
int temp=a[low];
while(low<high){
while(low<high && a[high] > temp)
high--;
a[low]=a[high];
while(low<high && a[low] < temp)
low++;
a[high]=a[low];
}
a[low]=temp;
return low;
}
void quicksort(int a[],int low,int high){
if(low < high){
int middle=part(a, low, high);
quicksort(a, low, middle-1);
quicksort(a,middle+1,high);
}
}
快排一次是将基准元素找到合适的位置,然后由基准元素划分为两部分再进行快速排序,但是快速排序存在最坏情况是就是如果为最大或者最小数字,且序列可能是非常有序的,那么就有可能将所有数都划分到一个序列去了,这样的话最坏的时间复杂度为O(n^2),因此常见的算法解决思想就是随机产生一个基准元素,然后交换你的low元素,再进行划分的序列,这样就很大程度上避免了最坏情况的产生。也就是说快排的时间不再是你的数据问题,而是你的随机数产生值的问题。
int part(int a[],int low,int high){
int temp=a[low];
while(low<high){
while(low<high && a[high] > temp)
high--;
a[low]=a[high];
while(low<high && a[low] < temp)
low++;
a[high]=a[low];
}
a[low]=temp;
return low;
}
int randpartition(int a[],int low,int high){
Random rand=new Random();
int ran=low+rand.nextInt(high-low+1);
int tem;
tem=a[ran];
a[ran]=a[low];
a[low]=tem;
return part(a,low,high);
}
void quicksort(int a[],int low,int high){
if(low < high){
int middle=randpartition(a, low, high);
quicksort(a, low, middle-1);
quicksort(a,middle+1,high);
}
}