快速排序
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两个子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置为止。
将区间按照基准值划分为左右两半部分的常见方式有:
1、hoare版本
2、挖坑法
3、前后指针法
Hoare版本
基准值的选择:一般情况下我们会选择待排序序列的最后一个元素或第一个元素作为基准值。但是,若待排序序列的最后一个元素是最值或者接近于最值的情况,就会使排序后的左右序列元素个数相差巨大,效率降低。所以我们一般采用三数取中法,找出序列开始结点、序列之间结点、序列最后结点的中间值作为基准值。
//三数取中选key法
int GetMidKey(int* a, int begin, int end)
{
int mid = begin + ((end - begin) >> 1);
if (a[begin] < a[mid])
{
if (a[mid] < a[end])
return mid;
else if (a[begin] < a[end])
return end;
else
return begin;
}
else
{
if (a[mid] > a[end])
return mid;
else if (a[end] < a[begin])
return end;
else
return begin;
}
}
int PartSort(int* a, int begin, int end)
{
int key = GetMidKey(a, begin, end);
Swap(&a[begin], &a