1.原理介绍
假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数,为了方便,就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边,类似下面这种排列:3 1 2 5 4 6 9 7 10 8,递归对左右两个区间进行同样排序即可。是一种不稳定(如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面)的排序算法,平均时间复杂度为O(nlogn) ,最好时间复杂度为 O(nlogn) ,最坏时间复杂度为O(n*n) ,空间复杂度为O(nlogn) 。
2.代码实现
void QuickSort(int* h, int left, int right) //随机选取哨兵放前面
{
if(h==NULL)
return;
if(left>=right)
return;
srand((unsigned)time(NULL)); //防止有序队列导致快速排序效率降低
int len=right-left;
int kindex=rand()%(len+1)+left;
swap(h[left],h[kindex]);
int key=h[left],i=left,j=right;
while(i<j)
{
while(h[j]>=key && i<j)
--j;
if(i<j)
h[i]=h[j];
while(h[i]<key && i<j)
++i;
if(i<j)
h[j]=h[i];
}
h[i]=key;
QuickSort(h,left,i-1);
QuickSort(h,j+1,right);
}