挖坑法:
1.选取基准值,基准值处为坑
2.从后往前寻找比基准值小的值填入坑内
3.从前往后寻找比基准值大的填入第二步的坑内
4.循环执行2和3,直至相遇再退出循环
5.将基准值填入相遇位置的坑内
第二步和第三步同样不能颠倒顺序,如果颠倒了位置,begin先走,然后找到对应的值,直接将end处的值给覆盖了
(以上文字理解的内容来自http://t.csdnimg.cn/3an5f)(代码是自己理解后再写的)
实现代码:
void quick_sort(int a[], size_t len)
{
if (len < 2)return;
int key = a[0]; //选取最左边为基准值,此时a[0]为坑
int begin = 0; //左指针
int end = len - 1; //右指针
while (begin < end)
{
//因为选取了最左边为基准值,所以必须右指针先走
while (begin < end && a[end] >= key)
{
end--;
}
a[begin] = a[end]; //刚开始begin==0,a[begin]是坑,把a[end]填进去,a[end]变成坑,下面又会填
while (begin < end && a[begin] <= key)
{
begin++;
}
a[end] = a[begin]; //填坑,此时a[begin]又变成坑
}
a[begin] = key; //基准值填充在相遇的地方
quick_sort(a, begin); //左序列
quick_sort(a + begin + 1, len - begin - 1); //右序列
}