数据结构入门——排序(代码实现)(下)

int GetMidi(int* a, int left, int right)
{int mid = (left + right) / 2;// left mid rightif (a[left] < a[mid]){if (a[mid] < a[right]){return mid;}else if (a[left] > a[right])  // mid是最大值{return left;}else{return right;}}else // a[left] > a[mid]{if (a[mid] > a[right]){return mid;}else if (a[left] < a[right]) // mid是最小{return left;}else{return right;}}
}
  1. 三数取中

  2. int GetMidi(int* a, int left, int right):这是一个名为GetMidi的函数,接受一个整型数组指针a,左边界索引left和右边界索引right作为参数。

  3. int mid = (left + right) / 2;:计算左右边界索引的中间索引mid,用于表示三个元素中间位置的索引。

  4. if (a[left] < a[mid]):如果左边界元素小于中间元素。

    a. if (a[mid] < a[right]):且中间元素小于右边界元素,则中间元素为中间值,返回中间索引mid

    b. else if (a[left] > a[right]):否则,如果左边界元素大于右边界元素,说明中间元素为最大值,返回左边界索引left

    c. else:否则,右边界元素为最大值,返回右边界索引right

  5. else:如果左边界元素大于中间元素。

    a. if (a[mid] > a[right]):且中间元素大于右边界元素,则中间元素为中间值,返回中间索引mid

    b. else if (a[left] < a[right]):否则,如果左边界元素小于右边界元素,说明中间元素为最小值,返回左边界索引left

    c. else:否则,右边界元素为最小值,返回右边界索引right

// Hoare
int PartSort1(int* a, int left, int right)
{//int midi = GetMidi(a, left, right);//Swap(&a[left], &a[midi]);int keyi = left;while (left < right){// 找小while (left < right && a[right] >= a[keyi]){--right;}// 找大while (left < right && a[left] <= a[keyi]){++left;}Swap(&a[left], &a[right]);}Swap(&a[keyi], &a[left]);return left;
};
  1. 快速排序(一)

  2. int PartSort1(int* a, int left, int right):这是一个名为PartSort1的函数,用于对数组进行划分操作,接受一个整型数组指针a,左边界索引left和右边界索引right作为参数。

  3. int keyi = left;:初始化关键元素索引keyi为左边界索引left,作为划分的基准元素索引。

  4. while (left < right):进入一个while循环,循环条件是左边界索引小于右边界索引,表示还有未比较的元素。

  5. while (left < right && a[right] >= a[keyi]):从右边开始找到第一个小于基准元素的元素位置。

  6. while (left < right && a[left] <= a[keyi]):从左边开始找到第一个大于基准元素的元素位置。

  7. Swap(&a[left], &a[right]);:交换左右两侧找到的不符合条件的元素,使得左侧元素小于基准元素,右侧元素大于基准元素。

  8. 继续循环,直到左右指针相遇。

  9. Swap(&a[keyi], &a[left]);:交换基准元素和左指针所指的元素,将基准元素放置到正确的位置。

  10. return left;:返回基准元素的最终位置,用于后续递归调用。

int PartSort2(int* a, int left, int right)
{int midi = GetMidi(a, left, right);Swap(&a[left], &a[midi]);int key = a[left];// 保存key值以后,左边形成第一个坑int hole = left;while (left < right){// 右边先走,找小,填到左边的坑,右边形成新的坑位while (left < right && a[right] >= key){--right;}a[hole] = a[right];hole = right;// 左边再走,找大,填到右边的坑,左边形成新的坑位while (left < right && a[left] <= key){++left;}a[hole] = a[left];hole = left;}a[hole] = key;return hole;
}
  1. 快速排序(二)

  2. int PartSort2(int* a, int left, int right):这是一个名为PartSort2的函数,用于对数组进行划分操作,接受一个整型数组指针a,左边界索引left和右边界索引right作为参数。

  3. int midi = GetMidi(a, left, right);:调用GetMidi函数找到左、中、右三个元素中的中间值索引midi,并将中间值元素与左边界元素交换位置。

  4. int key = a[left];:将左边界元素作为基准值key

  5. int hole = left;:初始化一个坑位hole,用于保存基准值的位置。

  6. while (left < right):进入一个while循环,循环条件是左边界索引小于右边界索引,表示还有未比较的元素。

  7. while (left < right && a[right] >= key):从右边开始找到第一个小于基准值的元素位置。

    a. a[hole] = a[right];:将找到的小于基准值的元素填充到左边的坑位,并更新坑位hole为右边界索引right

  8. while (left < right && a[left] <= key):从左边开始找到第一个大于基准值的元素位置。

    a. a[hole] = a[left];:将找到的大于基准值的元素填充到右边的坑位,并更新坑位hole为左边界索引left

  9. 继续循环,直到左右指针相遇。

  10. a[hole] = key;:将基准值填充到最后的坑位,完成一次划分操作。

  11. return hole;:返回基准值的最终位置,用于后续递归调用。

int PartSort3(int* a, int left, int right)
{int midi = GetMidi(a, left, right);Swap(&a[left], &a[midi]);int prev = left;int cur = prev + 1;int keyi = left;while (cur <= right){if (a[cur] < a[keyi] && ++prev != cur){Swap(&a[prev], &a[cur]);}++cur;}Swap(&a[prev], &a[keyi]);return prev;
}
  1. 快速排序(三)

  2. int PartSort3(int* a, int left, int right):这是一个名为PartSort3的函数,用于对数组进行划分操作,接受一个整型数组指针a,左边界索引left和右边界索引right作为参数。

  3. int midi = GetMidi(a, left, right);:调用GetMidi函数找到左、中、右三个元素中的中间值索引midi,并将中间值元素与左边界元素交换位置。

  4. int prev = left;:初始化prev为左边界索引left,用于记录小于基准值的元素的位置。

  5. int cur = prev + 1;:初始化curprev的下一个位置,用于遍历数组。

  6. int keyi = left;:初始化keyi为左边界索引left,作为划分的基准元素索引。

  7. while (cur <= right):进入一个while循环,循环条件是当前位置小于等于右边界索引,表示还有未比较的元素。

  8. if (a[cur] < a[keyi] && ++prev != cur):如果当前元素小于基准值且prev不等于cur,则交换prevcur位置的元素,将小于基准值的元素放到prev的下一个位置。

  9. ++cur;:移动cur指针到下一个位置。

  10. 继续循环直到遍历完整个数组。

  11. Swap(&a[prev], &a[keyi]);:将基准值放置到prev位置,完成一次划分操作。

  12. return prev;:返回基准值的最终位置,用于后续递归调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/2969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一寸照片裁剪怎么弄?修改照片尺寸,3种方法调整

一寸照片裁剪怎么弄&#xff1f;将照片裁剪为一寸尺寸&#xff0c;可以方便我们在各种场合中使用。无论是办理证件、申请签证&#xff0c;还是制作简历、参与活动&#xff0c;一寸照片都是不可或缺的资料。通过裁剪&#xff0c;我们能够确保照片的尺寸、比例符合标准&#xff0…

视频怎么批量压缩?5个好用的电脑软件和在线网站

视频怎么批量压缩&#xff1f;有时候我们需要批量压缩视频来节省存储空间&#xff0c;便于管理文件和空间&#xff0c;快速的传输发送给他人。有些快捷的视频压缩工具却只支持单个视频导入&#xff0c;非常影响压缩效率&#xff0c;那么今天就向大家从软件和在线网站2个角度介绍…

GoLand远程开发IDE:使用SSH远程连接服务器进行云端编程

目录 ⛳️推荐 1. 安装配置GoLand 2. 服务器开启SSH服务 3. GoLand本地服务器远程连接测试 4. 安装cpolar内网穿透远程访问服务器端 4.1 服务器端安装cpolar 4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&am…

OpenG中的读写簇函数

1.首先需要在Vi Package Manager中安装Open G 2.找到openG中的读写ini函数&#xff0c;第一组是将簇标签作为段名&#xff0c;第二组是指定段名&#xff0c;本质上都是一样 3.读写簇到ini文件 4.禁用写入&#xff0c;更改簇的元素&#xff0c;增加或者删除&#xff0c;原来…

c++取经之路(其八)——基础模板

我认为的模板其实就是个懒人工具&#xff0c;你来弄个模板&#xff0c;编译器自动给你生成对应的函数。 函数模板&#xff1a; 定义&#xff1a;函数模板是一个蓝图&#xff0c;它本身并不是函数&#xff0c;是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是…

Edge浏览器下载文件提示 “无法安全下载” 的解决方法

提示如下&#xff1a; 虽然我们可以通过 "保留" 进行下载&#xff0c;但是每次需要选择&#xff0c;比较麻烦 解决方法&#xff1a; 1、打开注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft 2、创建2个 "项" Edge\InsecureContentAllowedForUrls…

C++奇迹之旅:从0开始实现日期时间计算器

文章目录 &#x1f4dd;前言&#x1f320; 头文件Date.h&#x1f309;日期计算函数&#x1f320;前后置&#x1f309;前后置-- &#x1f320;两对象日期相减&#x1f309;自定义流输入和输出 &#x1f309; 代码&#x1f309; 头文件Date.h&#x1f320;Date.cpp&#x1f309; …

微软专家分享 | 拯救者杯 OPENAIGC开发者大赛 能量加油上海站启动啦!

由联想拯救者、AIGC开放社区、英特尔联合主办的“AI生成未来第二届拯救者杯OPENAIGC开发者大赛”自上线以来&#xff0c;吸引了广大开发者的热情参与。 为了向技术开发者、业务人员、高校学生、以及个体创业人员等参赛者们提供更充分的帮助与支持&#xff0c;AIGC开放社区特别…

SpringBoot3.0新特性尝鲜,秒启动的快感!熟悉SpringAOT与RuntimeHints

文章目录 一、前置知识1、官网2、安装GraalVM3、GraalVM的限制4、安装maven5、背景 二、打包SpringBoot3.01、项目准备2、打包3、打包成docker 三、认识AOT1、RuntimeHints2、RuntimeHintsRegistrar3、RegisterReflectionForBinding4、ImportRuntimeHints5、使用JDK动态代理也需…

【禅道客户案例】专访鸿泉物联研发副总监徐小倩,感受上市公司研发项目管理“知与行”

杭州鸿泉物联网技术股份有限公司&#xff08;以下简称“鸿泉物联”、“公司”&#xff09;成立于2009年6月11日&#xff0c;2019年11月6日登陆上海证券交易所科创板&#xff08;股票代码&#xff1a;688288&#xff09;&#xff0c;注册资本10034.392万元&#xff0c;目前员工6…

电磁仿真--基本操作-CST-(3)

目录 1. 目的 2. 建模过程 2.1 创建工程 2.2 修改单位 2.3 创建线和圆柱 2.4 创建螺旋结构 2.5 创建另一个圆柱 2.6 设置频率、背景和边界 2.7 选择RLC求解器 2.8 设置端口 2.9 配置求解器 3. 仿真结果 4. 总结 1. 目的 本文将介绍一种较为复杂的建模方法&#x…

计算机网络物理层思维导图+大纲笔记

大纲笔记&#xff1a; 物理层的基本概念 解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是具体的传输媒体 主要任务 确定与传输媒体接口有关的一些特性 机械特性 电气特性 功能特性 规程特性信道上传送的信号 基带信号 来自信源的信号&#xff0c;直接表…

全彩屏负氧离子监测站的使用

TH-FZ5在繁忙的都市生活中&#xff0c;我们往往忽视了一个至关重要的问题——空气质量。随着工业化的进程加速&#xff0c;空气污染已成为影响人们健康的一大隐患。为了实时监测和了解身边的空气质量&#xff0c;全彩屏负氧离子监测站应运而生&#xff0c;成为了我们守护呼吸健…

Golang | Leetcode Golang题解之第50题Pow(x,n)

题目&#xff1a; 题解&#xff1a; func myPow(x float64, n int) float64 {if n > 0 {return quickMul(x, n)}return 1.0 / quickMul(x, -n) }func quickMul(x float64, n int) float64 {if n 0 {return 1}y : quickMul(x, n/2)if n%2 0 {return y * y}return y * y * …

Redis 安装及配置教程(Windows)【安装】

文章目录 一、简介一、 下载1. GitHub 下载2. 其它渠道 二、 安装1. ZIP2. MSI 软件 / 环境安装及配置目录 一、简介 Redis 官网地址&#xff1a;https://redis.io/   Redis 源码地址&#xff1a;https://github.com/redis/redis   Redis 官网安装地址&#xff08;无Windo…

读天才与算法:人脑与AI的数学思维笔记09_分形

1. 分形 1.1. 1904年&#xff0c;瑞典数学家科赫&#xff08;Helge von Koch&#xff09;首次发表了雪花图案的结构——科赫曲线&#xff08;又称雪花曲线&#xff09;&#xff0c;它被认为是一种数学怪胎&#xff0c;一种奇怪的人工构造 1.1.1. 但实际上并不是&#xff0c;自…

4- 24

day02 1.100个英语单词 2.vp div3 不过有点小悲惨&#xff0c;第一题正常的直接看出来答案。第二题其实是map模拟&#xff0c;一直没有读懂题目的意思&#xff0c;题目给的序列是打乱的。找出最小的&#xff0c;讲原来的序列补全&#xff0c;如果mp中没有这个数字&#xff0c;…

Android 系统充电动画

效果 Android获取电池充电状态是否为快充可参考. Android_source/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java private int lastBatteryStatus;private final BroadcastReceiver mBatteryChangedReceiver new BroadcastRece…

杰发科技AC7840——CAN通信简介(6)_监听模式

参考&#xff1a;http://t.csdnimg.cn/AFFPC 0. 简介 7840支持4种扩展模式&#xff0c;其中监听模式。 监听模式概念 作用: 这里写的用于诊断&#xff0c;实际上我还没有用到&#xff0c;不太理解为啥可以用作诊断。 我的理解是&#xff0c;在多个总线下&#xff0c;使用监听…

BUUCTF-MISC-10.LSB1

10.LSB1 题目&#xff1a;lsb隐写&#xff0c;stegsolve可以看到包含了一个PNG图片 使用stegsolve打开这个图片 由PNG文件头可以看出隐写内容为PNG文件&#xff0c;按save Bin键保存为PNG文件。 得到一张二维码图片&#xff0c;使用CQR扫一下