快速排序(Quicksort)是對冒泡排序的一種改進。由C. A. R. Hoare在1962年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
算法過程
設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用第一個數據)作爲關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱爲一趟快速排序。值得注意的是,快速排序不是一種穩定的排序算法,也就是說,多個相同的值的相對位置也許會在算法結束時產生變動。值得一提:
隨機化快排:快速排序的最壞情況基於每次劃分對主元的選擇。基本的快速排序選取第一個元素作爲主元。這樣在數組已經有序的情況下,每次劃分將得到最壞的結果。一種比較常見的優化方法是隨機化算法,即隨機選取一個元素作爲主元。這種情況下雖然最壞情況仍然是O(n^2),但最壞情況不再依賴於輸入數據,而是由於隨機函數取值不佳。實際上,隨機化快速排序得到理論最壞情況的可能性僅爲1/(2^n)。所以隨機化快速排序可以對於絕大多數輸入數據達到O(nlogn)的期望時間複雜度。一位前輩做出了一個精闢的總結:“隨機化快速排序可以滿足一個人一輩子的人品需求。”
#include <iostream>
using namespace std;
#define N 1000
//*****************C++ 遞歸快排(隨機)******************//
int a[N];
void QuickSort(int *randData,int l,int r){
int i=l,j=r,key=0;
key=randData[(l+r)>>1];
key=randData[(rand()%(r-l+1)) + l];//生成大於等於l小於等於r的隨機數(非隨機則每次取第一個元素作爲key值!)
do{
while((randData[j]>key) && (j>l))//從右掃描小於中值的數
j--;
while((randData[i]<key) && (i<r))//從左掃描大於中值的數
i++;
if(i<=j){ //交換key值與當前值
swap(randData[i],randData[j]);
i++;
j--;
}
}while(i<=j);//如果兩邊掃描的下標交錯,就停止(完成一次)
if(l<j){ //當左邊部分有值(left<j),遞歸左半邊
QuickSort(randData,l,j);
}
if(r>i){ //當右邊部分有值(right>i),遞歸右半邊
QuickSort(randData,i,r);
}
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int i,j,k;
for(i=0;i<n;i++)a[i]=rand()%(999999999-0+1)+0;
QuickSort(a,0,n-1);
for(i=0;i<n;i++)printf("%d ",a[i]);
puts("");
}
return 0;
}