C语言实现Hoare版快速排序(递归版)

2023-12-17 14:36

本文主要是介绍C语言实现Hoare版快速排序(递归版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Hoare版

快速排序是由Hoare发明的,所以我们先来讲创始人的想法。我们直接切入主题,Hoare版快速排序的思想是将一个值设定为key,这个值不一定是第一个,如果你选其它的值作为你的key,那么你的思路也就要转换一下,好,我们刚刚说到将一个值设为key(这里我们就将第一个值设为key就好了),left在最左边,right在最右边,我们设定好key值之后,先让right往左走(目标是找小),找到比key小的值就停下,再让left往右走(目标是找大),找到比key大的值就停下,然后交换right和left的值,这样就会让大的那一个值到右边,小的那一个值到左边,交换完后再让right先走,以此类推直到相遇,相遇后的那个值再跟key进行交换,一趟就结束了,快速排序的一个特点是每一趟走完都会定下这个key值的位置,也就是说每一趟走完都将固定一个值,然后进行递归,把所有值都固定就排序完成了。

接下来说说第二趟也就是如何来递归,我们前面说过了,每一趟都会确认一个值的位置,那么,我们的步骤就是类比二叉树的后序遍历一样,以固定的值为最左值或最右值,依次固定住所有的该在的位置。

我们已经知道,每一趟都会确定key值以及位置,那么我们就将每一趟排序的过程单独封装成一个函数PartSort1.既然是递归,那么我们肯定要有结束条件吧,结束条件就是begin>=end,为什么是这个呢?我们看下面的代码,我说过了,类似后序遍历的思想,所以我们就写出了先找左,再找右的递归代码,第一个QuickSort就是往左递归嘛,那么起始位置就是begin不变,右边的界限就是我们通过函数找出来的k(key交换后的下标),但是要减一,因为key的下标k已经是确定好的了嘛,就不需要访问它了;第二个QuickSort自然就是访问右边了,访问右边最右边就不用动,最左边是k+1,理由跟上面的是一样的。

这样我们就理解了,第一个QuickSort后如果只有一个数据可以访问,那么begin是==end的,就该停止,那么第二QuickSort个可能就是没有数据,这个时候begin就会大于end,也要停止,接下来我们具体看看排序部分是怎么写的。

从上往下的思路是left等于最左值,right等于最右值,key也等于最左值的下标,当还没相遇的情况下,循环就会继续,按照思路先让右边找小,找到就停止,但是不要漏了后面的条件,因为如果没有找到,就会一直往左走,到最后right就变成负的了。同理,下面left的思路也是一样的,left和right都找到后就交换,当两个相遇之后,把key的值跟他们交换就行了。然后返回新的key下标。

这篇关于C语言实现Hoare版快速排序(递归版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl