快速排序(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);
}
}