1.快速排序
快速排序的基本思路屬於分治算法的一種,通過選擇數組中的某一個元素作為分界點(key),大於key的元素放置在數組右邊,小於key的元素放置在數組的左邊,然后通過遞歸調用該過程來實現排序算法。
代碼如下:
int Partition(int *A, int p, int q){
int i = p;
int key = A[i];
for(int j = p+1; j <= q, j++){
if(A[j]<key){
i++;
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
int temp = A[i];
A[i] = A[P];
A[p] = temp;
return i;
}
void QuickSort(int *A, int p, int q){
if(p<q){
int r = Partition(A, p, q);
QuickSort(A, p, r-1);
QuickSort(A, r+1, q);
}else{
return ;
}
}
代碼中主要有兩個函數Partition(int *A, int p, int q)和QuickSort(int *A, int p, int q),
其中,Partition(int *A, int p, int q)中,指針A指向待排序的數組,p為待排序數組的起點,q為終點,函數中選用數組的起點A[p]作為分界點(key),結果該函數調用后,數組A中大於key的元素在key的右邊,小於key的元素在key的左邊。
QuickSort(int *A, int p , int q)函數為快速排序的實現函數,通過遞歸調用每次對數組進行分界Partition操作,最終實現對數組的排序。
2.隨機快速排序
在快速排序中每次對數組的分界操作Partition都是以數組的其實點作為分界點(key),這樣就帶來了一個問題——當待排序數組是一個已排好序的數組時,快速排序的執行時間是O(n平方),在執行 時間上比較耗時,於是就有了隨機快速排序的思想。
在隨機快速排序中,每次對數組的分界操作Partition都是在數組中隨機尋找一個元素作為分界點(key),這樣就避免了上訴問題,隨機排序的平均在執行時間為O(n*lg(n))。比上面的O(n平方)有很大的提高。