目录
一、前言
对于快速排序的介绍,请大家点击下面链接,那里有对初始版本的详细介绍。
今天主要讲解一个更加容易理解的方法--挖坑法。
二、挖坑法的思想
1、先挖坑
2、再填坑
快排的本质还是让hole排序一次后就到了他的最终位置。
所以这里我们的 left 负责找小值,right 负责找大值。
具体的步骤:
1)把第一个数保存在临时变量hole中
循环:2) left找比hole小的数放入坑中,自己的位置形成新的坑
3)right找大值放入新的坑中,自己的位置形成新的坑
4)left和right相遇时,把hole的值放入
看不懂文字没关系,咱们上图解:(找值和放坑为一个动作)
三、代码实现
和上一篇里讲述的一致,一次挖坑后就把数组分成了三个部分:
【左子列】 hole 【右子列】
接下来,我们只用分别对左右子列分别处理,直到左右子列区间不存在即可(递归的思想)
//一次挖坑
int PartSort(int* a, int left, int right)
{
int _hole = a[left];
int hole = left;
while (left < right)
{
while (left < right)
{
if (a[right] < _hole)
{
a[hole] = a[right];
hole = right;
break;
}
right--;
}
while (left < right)
{
if (a[left] > _hole)
{
a[hole] = a[left];
hole = left;
break;
}
left++;
}
}
a[left] = _hole;
return hole;
}
//整个数组都挖一遍 递归
void HoleSort(int* a, int begin, int end)
{
// left hole right
if (begin >= end)
return;
int hole = PartSort(a, begin, end);
HoleSort(a, begin, hole - 1);
HoleSort(a, hole + 1, end);
}
四、结语
谢谢大家看到最后,相对于第一个方法,这个方法更容易理解,上手起来更加容易。
但是其中的本质是一样的,作者主页也有其他两种方法的介绍,欢迎大家关注。
如果文章有误,欢迎大家指出!
最后,作者主页有许多有趣的知识,欢迎大家关注作者,作者会持续更新有趣的代码,在有趣的玩意儿中成长!