在所有的比較排序中,快速排序的實際效率是最高的,即便最壞情況的時間複雜度爲O(n^2),也是分治算法的一種
大體的算法思想不再贅述,開卷有益,書上說的很清晰。
其中核心爲Partiton函數,
基本算法是對於一個數組a找到一個位置p,使得p之前的元素都不大於a[p],p之後的元素都不小於a[p]
//快速排序:
//快速排序的一種最壞情況的算法複雜度爲O(n^2),但是在實際中,卻是效率最好的排序算法,因爲它的平均算法複雜度
//快速排序也是一種分治算法
// Author's E-mail : [email protected] Feel free to contact me for comments on my work
#include <iostream>
#include <cstdlib>
#include <ctime>
#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
void exchange(int &a,int &b){
int temp = a;
a = b;
b = temp;
}
int Partition(int *a,int p,int r){
int x = a[r];
int s = p - 1;//s作爲小於x的區域末尾,與大於x的區域分隔開
for (int i = p; i < r;i++){
if(a[i]<x){
s++;
exchange(a[s], a[i]);
}
}
exchange(a[s + 1], a[r]);
return s + 1;
}
//由於劃分數組時情況不同會對算法效率由較大影響,在主元的選取上,採用隨機抽樣而不是隻去a[r]作爲主元,這樣期望對數組的劃分是均衡的
int RandomPartition(int *a,int p,int r){
int t = random(p,r);
exchange(a[t], a[r]);
return Partition(a, p, r);
}
void QuickSort(int *a,int p,int r){
if(p<r){
//int q = Partition(a, p, r);
int q = RandomPartition(a, p, r);
QuickSort(a,p,q-1);
QuickSort(a, q + 1, r);
}
}
void printArray(int *a){
for (int i = 0; i <= 9;i++){
cout << a[i] << " ";
}
cout << endl;
}
int main(){
srand((unsigned)time(NULL));
int array[] = {4,1,3,2,16,9,10,14,8,7};
QuickSort(array,0,9);
printArray(array);
system("pause");
return 0;
}
實際上,出現最差情況的時候,是由於劃分時,剩下的n-1個元素全部被劃到一邊去了,爲了儘可能的避免這種情況,對於partition函數中主元的選取,使用隨機抽樣的方式來代替默認的a[r]。