在所有的比较排序中,快速排序的实际效率是最高的,即便最坏情况的时间复杂度为O(n^2),也是分治算法的一种
大体的算法思想不再赘述,开卷有益,书上说的很清晰。
其中核心为Partiton函数,
基本算法是对于一个数组a找到一个位置p,使得p之前的元素都不大于a[p],p之后的元素都不小于a[p]
//快速排序:
//快速排序的一种最坏情况的算法复杂度为O(n^2),但是在实际中,却是效率最好的排序算法,因为它的平均算法复杂度
//快速排序也是一种分治算法
// Author's E-mail : steven_zhaosh@163.com 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]。