排序(6)——快速排序算法之挖坑版&前后指针版

2024-03-09 10:20

本文主要是介绍排序(6)——快速排序算法之挖坑版&前后指针版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

挖坑版

基本思路

代码实现

 注意点

前后指针版

基本思路

代码实现

注意点


由于hoare版本的快速排序有很多坑和需要注意的地方,就会导致代码写起来不容易,这里我们给出两种不同的单趟排序思路:挖坑版&前后指针版

挖坑版

基本思路

先将第一个数记作key,然后把它当作一个坑位。右边先走找小,找到后填补到坑位上,然后该位置变成新的坑位。接着左边走找大,找到后再将该数填到坑位上,该位置变成新坑位。如此循环往复,直到二人相遇,再把key填补到相遇点。

如下为图解

代码实现

  • 注意:holei是下标!!
// 挖坑法
int PartSort2(int* a, int begin, int end)
{int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int key = a[begin];int holei = begin;while (begin < end){// 右边找小,填到左边的坑while (begin < end && a[end] >= key){--end;}a[holei] = a[end];holei = end;// 左边找大,填到右边的坑while (begin < end && a[begin] <= key){++begin;}a[holei] = a[begin];holei = begin;}a[holei] = key;return holei;
}

 注意点

  • holei是下标
  • key是最左边的值,则right先走
  • key是最右边的值,则left先走
  • 要记得将坑位转移
  • 时间复杂度:O(N)

该方法本质上还是hoare的思想,在性能上并没有比hoare好,但是更好理解

前后指针版

基本思路

首元素为key,设置两个指针cur和prev,prev指向第一个元素,cur指向它的下一个元素。

  • cur找大比key值大的值,++cur
  • cur找到比key值小的值,++prev,交换prev和cur位置的值,++cur

关于交换:

  • prev可能会和cur指向同一个值,这个时候他们两个还没有分开。
  • 当二者拉开距离,prev就会和远处的cur交换值了。此时的prev就是比key要大的值,因为cur在之前已经过滤掉了这些数,从而达到小值换到前面,大值换到后面的效果。

如下图解 

我们可以看出,这就类似于推箱子,遇到比key小的值了后,一直将7和9往后退,将小的那个值往前推。

代码实现

//前后指针
int PartSort3(int* a, int begin, int end)
{int midi = GetMidi(a, begin, end);Swap(&a[midi], &a[begin]);int keyi = begin;int prev = begin;int cur = prev + 1;while (cur <= end){if (a[cur] < a[keyi] && ++prev != cur)Swap(&a[prev], &a[cur]);++cur;}Swap(&a[prev], &a[keyi]);keyi = prev;return keyi;
}

注意点

  • 如果++prev==cur的话,那就是自己和自己交换,那么在这里是没有必要的,我们可以直接让cur++即可,所以我们将它归并到else里。
  • keyi是下标
  • 注意结束条件,cur<=end要加等号,因为当cur==end的时候,还要判断。只有当它越界的时候才跳出循环。
  • 时间复杂度:O(N)

这三种方法单趟排序出来的结果都不一样!!注意区分。

这篇关于排序(6)——快速排序算法之挖坑版&前后指针版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/790381

相关文章

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Python如何快速下载依赖

《Python如何快速下载依赖》本文介绍了四种在Python中快速下载依赖的方法,包括使用国内镜像源、开启pip并发下载功能、使用pipreqs批量下载项目依赖以及使用conda管理依赖,通过这些方法... 目录python快速下载依赖1. 使用国内镜像源临时使用镜像源永久配置镜像源2. 使用 pip 的并

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1