快速排序:挖坑法、前后指针法和三数取中优化

本文详细介绍了快速排序的两种划分方法——挖坑法和前后指针法,并探讨了三数取中法的优化策略,以提升排序效率。此外,还提出了在小区间时采用插入排序的优化措施。
摘要由CSDN通过智能技术生成

上一篇博客中,我们看过了快速排序的基本划分方法——霍尔法的实现。事实上,区间划分也可以通过挖坑法和前后指针法来完成,从而实现快速排序。那么本篇博客,我们来讲解这两种方法。


一、挖坑法

顾名思义,此方法的思路是将位置空出来(存入临时变量),再将找到的数据填入这个空白位置。如下图:
在这里插入图片描述
可以看到,利用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值