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

news/2024/5/19 0:05:24
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.mrgr.cn/p/11875430

相关文章

戴森球计划:关于打帆星距离与建筑效率的精确计算

来源贴吧: 作者:wolray 日期:2024-03-05结论放开头:由于俯仰角限制,打帆建筑效率(可打帆建筑面积与球面占比)的极限最大值为35.9%,星球轨道越远,太阳帆轨道半径越大,越接近该值,但变化微乎其微。最佳打帆策略:离恒星最近的潮汐锁定星,打最小轨道的帆。该结论与小马…

Docker镜像使用(一)

1.1 镜像获取 从 Docker 镜像仓库获取镜像的命令是docker pull。其命令格式为:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]拉去镜像之后我们可以使用docker image ls查看镜像运行我们拉去的镜像: docker run -it --rm hello-worlddocker run就是运行容…

VBA技术资料MF144:将PDF首页作为对象插入工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

明日方舟游戏助手:一键完成日常任务 | 开源日报 No.233

MaaAssistantArknights/MaaAssistantArknights Stars: 11.6k License: AGPL-3.0 MaaAssistantArknights 是一款《明日方舟》游戏的小助手&#xff0c;基于图像识别技术&#xff0c;支持一键完成全部日常任务。 刷理智、掉落识别及上传企鹅物流智能基建换班、自动计算干员效率…

stm32实现hid鼠标

启动CubelMX 选择芯片&#xff08;直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置 配置时钟 项目输出设置 打开工程&#xff08;后记&#xff1a;此工程含有中文不能编译通过) 配置项目 配置调试器 编译无法通过 删除路径中的中文&#xff0c;以及…

快速部署 微软开源的 Garnet 键值数据库

快速部署 微软开源的 Garnet 键值数据库 Garnet 是 Microsoft Research 推出的一种新型远程缓存存储,其设计速度极快、可扩展且延迟低。 Garnet 在单个节点内是线程可扩展的。它还支持分片集群执行、复制、检查点、故障转移和事务。它可以在主内存以及分层存储(例如 SSD 和 A…

Sentinel如何持久化数据到Nacos?

默认情况下 Sentinel 只能接收到 Nacos 推送的消息,但不能将自己控制台修改的信息同步给 Nacos,如下图所示:但是在生成环境下,我们为了更方便的操作,是需要将 Sentinel 控制台修改的规则也同步到 Nacos 的,所以在这种情况下我们就需要修改 Sentinel 的源码,让其可以实现…

k8s日常动手实践 ~~ pod访问 pod请求 k8s api ~ 含新版带curl的busybox镜像

前言&#xff1a; 可以使用 Kubernetes API 获取集群信息。使用 Service Account&#xff08;SA&#xff09;进行身份验证&#xff0c;可以以安全的方式访问 Kubernetes API&#xff0c;而无需在 Pod 中使用明文凭据。 以下是一个使用 Service Account 访问 Kubernetes API 获…

mysql系列04---索引及性能分析

1、索引的结构mysql索引的数据结构,对经典的B+Tree进行了优化,在原B+Tree上增加了一个指向相邻叶子结点的链表指针,就形成了一个带有顺序指针的B+Tree,提高了区间访问的性能。 选择B+Tree的优点: a、相对于二叉树,层级更少,搜索效率更高 b、相对于B-Tree,B+Tree只在叶子节…

HarmonyOS开发案例:【图片编辑】

介绍 本篇Codelab是基于ArkTS的声明式开发范式的样例&#xff0c;主要介绍了图片编辑实现过程。样例主要包含以下功能&#xff1a; 图片的解码。使用PixelMap进行图片编辑&#xff0c;如裁剪、旋转、亮度、透明度、饱和度等。图片的编码。 相关概念 [图片解码]&#xff1a;读…

transformer 最简单学习3, 训练文本数据输入的形式

1、输入数据中&#xff0c;源数据和目标数据的定义 def get_batch(source,i):用于获取每个批数据合理大小的源数据和目标数据参数source 是通过batchfy 得到的划分batch个 ,的所有数据&#xff0c;并且转置列表示i第几个batchbptt 15 #超参数&#xff0c;一次输入多少个ba…

创建Android Studio项目

如果想在其他模拟器(如雷电上打开项目,需要提前模拟器)下载好Android Studio后,打开 选择new project 选择自己想用的模板 输入基本信息:项目名称,包命名,版本等 点击finish加载完成后结束

Docker基础——50台容器异常占用宿主机90%内存问题

一、问题描述 一台裸金属服务存有50台业务容器,通过Docker进程起服务,由system-runtime守护容器的生命周期。 free -h查看裸金属服务器内存没有正常释放,cat /proc/meminfo查看内存分配无异常,怀疑裸金属服务器 的Java进程存在Glibc内存泄漏,或Docker容器没有正常关闭进程…

Docker 容器操作

容器创建 就是将镜像加载到容器的过程。 新创建的容器默认处于停止状态&#xff0c;不运行任何程序&#xff0c;需要在其中发起一个进程来启动容器。 格式&#xff1a;docker create [选项] 镜像 常用选项&#xff1a; -i&#xff1a;让容器开启标准输入 -t&#xff1a;让…

LFI to RCE [NewStarCtf]Include

记录一个没见过的RCE类型题目。先看源码:点击查看代码 <?phperror_reporting(0);if(isset($_GET[file])) {$file = $_GET[file];if(preg_match(/flag|log|session|filter|input|data/i, $file)) {die(hacker!);}include($file.".php");# Something in phpinfo.p…

C语言扫雷游戏完整实现(下)

文章目录 前言一、排雷函数菜单二、排雷函数菜单的实现三、拓展棋盘功能四、源码1. test.c源文件2. game.h头文件3. game.c源文件 总结 前言 C语言实现扫雷游戏的排雷菜单&#xff0c;以及功能的实现&#xff0c;拓展棋盘功能&#xff0c;以及源码等。 上半部分的链接地址: C语…

echart 常用属性

echart 常用属性 基础属性 title 左上角标题 legend 每一项的列表 xAxis: x轴上的数据 yAxis: y轴上的数据提示框 tooltip: {trigger: axis},demo地址:https://echarts.apache.org/v4/examples/zh/editor.html?c=line-stack 文字转动 斜着摆放 axisLabel.rotate: 30滚动条 da…

VScode远程连接虚拟机提示: 无法建立连接:XHR failed.问题解决方案

一问题描述 在vscode下载插件Remote-SSH远程连接虚拟机时提示无法建立连接 二.最大嫌疑原因&#xff1a; 我也是在网上找了许久&#xff0c;发现就是网络原因&#xff0c;具体不知&#xff0c;明明访问别的网页没问题&#xff0c;就是连不上&#xff0c;然后发现下载vscode的…

.Net添加了引用,仍然提示找不到命名空间

如图&#xff0c;MyStudy控制台程序引用了一个C#类库MyClassLibrary 代码里也能敲出来using MyClassLibrary&#xff0c;但是build时始终提示找不到命名空间MyClassLibrary 我检查了MyClassLibrary的Assembly&#xff0c;命名空间名称无误 又检查了MyStudy里的引用信息&#x…

three.js实现相机碰撞,相机不穿墙壁、物体

大家好,本文实现了相机碰撞检测,使相机不穿墙壁、物体,并给出了思路和代码,感谢大家~大家好,本文实现了相机碰撞检测,使相机不穿墙壁、物体,并给出了思路和代码,感谢大家~ 关键词:数字孪生、three.js、Web3D、WebGL、相机碰撞、游戏相机 我正在承接Web3D数字孪生项目,…