概述
上一篇的内容中,已经介绍过快速排序中的一种霍尔划分的算法,这篇我们来看看第二种快速排序的划分方法——挖坑法
挖坑法划分
例如还是上一篇文章中的无序数列,我们依旧是选择一个基准值,仍然通过begin和end指针来操作
首先,我们仍然是从end开始向前找一个小于28的数,找到后直接放在begin的位置,注意这里不是交换,如下图
箭头所指向的是我们选取的基准值,这时可以理解为它不在这个数列当中,而end对应的位置就出现了一个坑,这时,begin开始向后寻找,找到第一个大于基准值的数后放到end的位置,如下图
此时,begin的位置又会出现一个坑,这时再次让end向前移动继续找第一个小于基准值的数,放到begin的位置,再使begin向后移动找第一个大于基准值的数,重复此操作直到begin和end相遇,这时,把基准值放到该位置。这样,一趟快速排序结束,如下图
此时,28的前面都是小于它的数,其后面都是大于它的数,则28的位置确定,只需要递归进行快排后,就会变成一个有序数列
代码如下
//挖坑法划分
int partion(int* array,int begin,int end)//待排序的数组起始地址,及首尾下标
{
int key = array[begin];//选取第一个数为基准值
while(begin<end)//循环条件
{
while(begin<end&&array[end] >= key)//从后向前找第一个小于基准值的数
end--;
array[begin] = array[end];//放到begin位置
while(begin<end&&array[begin] <= key)//从前向后找第一个大于基准值的数
begin++;
array[end] = array[begin];放到end的位置
}
//此时跳出循环,则begin和end相遇
array[begin] = key;//将基准值放入该位置
return begin;//返回当前基准值的位置,以便递归划分
}
挖坑法划分完成后,我们也是写一个递归调用函数,和上一篇的调用一样,这里便不多说
void quicksort(int* array,int begin,int end)
{
if(begin >= end)
return ;
int keypos = partion(array,begin,end);
quicksort(array,begin,keypos - 1);
quicksort(array,keypos + 1,end);
}
这里,第二种划分方法也介绍给大家了,大家可以下去试着写一写哦!
最后
以上就是现代冷风为你收集整理的快速排序(挖坑法)的全部内容,希望文章能够帮你解决快速排序(挖坑法)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复