上一篇博客中,我们看过了快速排序的基本划分方法——霍尔法的实现。事实上,区间划分也可以通过挖坑法和前后指针法来完成,从而实现快速排序。那么本篇博客,我们来讲解这两种方法。
一、挖坑法
顾名思义,此方法的思路是将位置空出来(存入临时变量),再将找到的数据填入这个空白位置。如下图:
可以看到,利用end和begin寻找比基准值小和大的元素的思路不变,在寻找到之后,直接将找到的元素“填入”“坑”中,最后再将基准值填入,就完成了一趟排序。代码如下:
int partition2(int* arr, int begin, int end){
//挖坑法
int key = arr[begin];
while (begin < end){
while (begin < end && arr[end] >= key){
end--;
}
arr[begin] = arr[end];
while (begin < end && arr[begin] <= key){
begin++;
}
arr[end] = arr[begin];
}
arr[begin] = key;
return begin;
}
二、前后指针法
前后指针法的大体思路为:设定一个prev指针和一个cur指针,这两个指针初始时是相邻的。它们同时向后扫描,若cur找到大于基准值的元素,则prev停止移动,cur继续向后移动,直到找到下一个小于基准值的元素。找到此元素之后,交换prev和cur指针所在元素。交换结束后cur继续向后扫描。重复此过程,直到cur扫描到数组末尾为止。简单来说就是:若prev和cur不相邻,且cur所在位置的值小于基准值,则交换cur和prev位置的值。示意图如下:
代码如下:
int partition3(int* arr, i