排序——希尔排序、插入排序

本节复习排序中的希尔排序,希尔排序属于插入排序。 希尔排序的代码和插入排序非常类似。 思想却相对于插入排序来说复杂。 

在复习希尔排序之前, 我们需要先复习一下插入排序。

目录

插入排序

插入过程

代码实现

希尔排序

希尔排序的思想

代码实现 


插入排序

插入过程

插入排序的思想就是寻找向数组的前面遍历寻找适合的空位。 然后插入进去。 

如图这几个数据。 

插入排序排升序的过程就是:

首先,红指针指向第二个元素。 黑指针指向第一个元素。 然后看黑指针指向的数据是否小于红指针。 小于的话就将红指针的数据放到黑指针的位置。 黑指针所指向以及之后的数据向后覆盖。 如果黑指针越界也没有找到。 那么红指针指向数据就放到第一个位置。 

5放到第一个位置, 9向后覆盖。如图: 

继续:

 红指针向后移动一位。 黑指针继续指向红指针前面的一位。 

 

找不到, 将2放到第一个位置。 5和9向后覆盖如图:

然后红指针重新向后移动一位,黑指针重新指向红指针前一个位置。

 向前找

找到了, 然后将4放到黑指针指向位置。 2, 5, 9, 向后覆盖: 

然后红指针向后移动一位, 黑指针指向其前一个位置。 循环往复。 这里就不画了。

插入排序就是这么一个过程。 现在我们来实现一下代码: 

代码实现


//插入排序
void InsertSort(int* a, int sz)//插入排序,n^2里面最优的一个 
{//[0, end], 有序,插入一个tmp值, 依旧保持串数列有序, 如何插入。 for (int i = 1; i < sz; i++) {int end = i - 1;//让end指向已有序的最后一个数字。 int tmp = a[i];//让将end后面的那个待排序的数字赋值给tmp。while (end >= 0) //让end一步一步向后走, 到end == 0位置{if (tmp < a[end]) //看一下tmp和a[end]哪个比较大, 如果tmp的值小, 那么说明待排序的那个数字应该在第end以前的位置//第end个数字以后已排序的数字, 整体向后移动一位。{a[end + 1] = a[end];//让第end位置的数字向后覆盖一位。end--;//end位置的数字向后移动一位的同时, end--, 继续检查下一个数字。 }else//一直到第tmp 大于 第end位置的数字, 说明tmp应该就是第end + 1位置的数字。 而此时第end + 1和第 end + 2可能//是同一个数字或者tmp刚刚开始检查, 没有向后检查呢就检查出错误。{//为什么不在这里直接进行插入, 是因为可能找到最后一个数也没有找到要排序的位置。//那么这一个位置就只能覆盖成别的数字。 break;}}a[end + 1] = tmp;//放在这里就解决了到end == 0的时候也没有找到比tmp小的数字的位置。 }}

插入排序实现后理解希尔排序就相对简单一些。 现在来看希尔排序:

希尔排序

希尔排序的思想

希尔排序的思想就是将数组分为几组。 

如图分成三组。 然后对第一组的第一个数和第二组的第一个数和第三组的第一个数进行插入排序。

第一组的第二个数, 第二组的第二个数, 第三组的第三个数进行插入排序

第一组的第三个数, 第二组的第三个数, 第三组的第三个数进行插入排序。

然后分组的大小减小,再次进行这样的排序, 直到每组大小减小到1如图:

再次进行最后一轮插入排序。 整个数组就成为了有序。 这个过程就是希尔排序。 

代码实现 


//希尔排序
void ShellSort(int* a, int sz) 
{int gap = sz / 2;//先让gap为二分之待排序数组长度, 然后每次子插入排序都让gap除以2.while (gap > 1) //gap最小为2的时候就能让数组变的有序。 所以gap > 1是为了保证gap会成为最小的那个2.并且不会做多余的排序{gap = gap / 2;//gap在每次子插入排序中都除以2.for (int i = gap; i < sz; i++) //让i 从gap开始, 因为对于一个希尔排序, 每gap个数字可以看成一个数字。 //因为每组内对应位置的数字都会和其他gap组合内的其他数字进行子插入排序。 {int end = i - gap;//gap为一组, gap看成一个数字。int tmp = a[end + gap];//gap为一组, gap看成一个数字,//例如, 第一个gap内第一个数字和第二个gap内第一个数字会进行插入排序。while (end >= 0) {if (tmp < a[end]) //这里不好想像, 其实就是寻找一个合适的待排序的数字的位置。 这个数字碰到比他大的//end就向前移动一位。 然后和前一个数字比较。{a[end + gap] = a[end];end -= gap;}else {break;}}a[end + gap] = tmp;//这里和插入排序相同}}
}

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

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

相关文章

蓝桥杯之【01背包模版】牛客例题展示

牛客链接 #include <bits/stdc.h> using namespace std; int n,V; const int N1010; int v[N],w[N]; int dp[N][N]; int main() {cin>>n>>V;for(int i1;i<n;i){cin>>v[i]>>w[i];}for(int i1;i<n;i){for(int j1;j<V;j){dp[i][j]dp[i-1][…

Svg Flow Editor 原生svg流程图编辑器(一)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; 效果展示 项目概述 svg flow editor 是一款流程图编辑器&#xff0c;提供了一系列流程图交互、编辑所必需的功能&#xff0c;支持前端研发自定义开发各种逻辑编排场景&#xff0c;如流程图、ER 图、…

【xv6操作系统】Lab systems calls

一、实验前须知 阅读 xv6 文档的第 2 章和第 4 章的 4.3 节和 4.4 节以及相关源文件&#xff1a; 系统调用的用户空间代码在 user/user.h 和 user/usys.pl 中。 内核空间代码在 kernel/syscall.h 和 kernel/syscall.c 中。 与进程相关的代码在 kernel/proc.h 和 kernel/proc.c…

for语句的实际应用(3)

3145&#xff1a;【例24.3】 奇数求和 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 9847 通过数: 5442 【题目描述】 计算非负整数 m 到 n&#xff08;包括 m 和 n&#xff09;之间的所有奇数的和&#xff0c;其中&#xff0c;m 不大于 n&#xff0c;且 n 不大…

CorelDRAW Standard2024适合业余爱好者和家庭企业的图形设计软件

CorelDRAW Standard 2024是一款功能强大的矢量图形设计软件&#xff0c;专为图形爱好者、家庭用户、微型企业和学生们设计。该软件在Windows平台上运行&#xff0c;并提供了智能对象、布局、插图和模板等功能&#xff0c;帮助用户快速创建高质量的设计作品。 CorelDRAW Standa…

如何快速解决leetcode 热题100

刷LeetCode 100题&#xff1a;高效攻略与实操步骤 在编程和算法领域&#xff0c;LeetCode 是一个极受欢迎的平台&#xff0c;它提供了大量的编程题目&#xff0c;帮助开发者提升编程技能和解决问题的能力。对于很多初学者和求职者来说&#xff0c;刷题是一个提高自己竞争力的有…

在 build.gradle.kts 添加 阿里云仓库

在 build.gradle.kts 添加 maven 仓库 使用 kotlin script DSL 配置 build.gradle.kts &#xff08;高版本移动到settings.gradle.kts&#xff09;时&#xff0c;添加 maven 仓库的方式如下&#xff1a; pluginManagement {repositories {maven {setUrl("https://maven.a…

【CMake】顶层 CMakeList.txt 常用命令总结

文章目录 1. cmake_minimum_required1.1. 简介1.2. 使用案例1.2.1. 执行构建的cmake版本低于<min>1.2.2. 设置<policy_max>1.2.2.1. <policy_max>低于<min>1.2.2.2. <policy_max>大于等于<min> 1. cmake_minimum_required 1.1. 简介 功能…

图机器学习(4)-面向连接层面的人工特征工程

0 问题定义 通过已经连接去猜未知连接&#xff1a; 有两个思路&#xff1a; &#xff08;1&#xff09;直接提取link的特征&#xff0c;把link变成D维向量&#xff1b; &#xff08;2&#xff09;把link两端节点的D维向量拼在一起&#xff0c;缺点&#xff1a;丢失了link本身…

【C++】手撕string类(超实用!)

前言 一、标准库中的string类 1.1 string类介绍 1.2 string的常用接口 1.2.1 常用的构造函数 1.2.2 容量操作接口 &#xff08;1&#xff09;size &#xff08;2&#xff09;capacity &#xff08;3&#xff09;empty &#xff08;4&#xff09;clear &#xff08…

MySQL 学习笔记(基础篇 Day3)

「写在前面」 本文为黑马程序员 MySQL 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. MySQL 学习笔记&#xff08;基础篇 Day1&#xff09; 2. MySQL 学习笔记&#xff08…

移掉 K 位数字(LeetCode 402)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路4.1 暴力法4.2 贪心 单调栈 参考文献 1.问题描述 给你一个以字符串表示的非负整数 num 和一个整数 k&#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的整数最小。请你以字符串形式返回这个最小的整数。 示例 1 …

chrome插件开发的几种展现页面形式,3分钟看完

想要开发一个chrome浏览器插件&#xff0c;还是很有必要清楚插件都可以在哪些地方显示出来的&#xff0c;比如只想在pop页面弹出&#xff0c;还是添加右键菜单&#xff0c;还是提示桌面通知&#xff1f;还是在哪里展示&#xff1f;有哪些展示方式等 browserAction(浏览器右上角…

《C语言缺陷和陷阱》-笔记(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、和 1. 2. 二、&和 | &&和|| 二、复合操作符 三、字符串和字符 前言 在这一节中&#xff0c;我们将探索对记号的意义的普遍的误解以及记号和…

原油数据处理:1.聚类、盐含量测定与近红外光谱快速评估

一、原油种类的聚类分析 在塔里木盆地塔河油田的原油处理过程中&#xff0c;需要对原油进行地球化学特征研究&#xff0c;以了解其成因和特征。根据地球化学手段的综合研究结果&#xff0c;塔河油田奥陶系原油属于海相沉积环境&#xff0c;成熟度较高&#xff0c;正构烷烃分布…

内存映射实现父子进程通信

创建内存映射区&#xff1a; void *mmap(void *addr ,size_t length,int prot,int flags,int fd,off_t offset); 参数&#xff1a; addr 指定映射区的首地址。通常NULL&#xff0c;表示让系统自动分配length 共享内存映射区的长度prot 共享内存的读写属性 PROT_READ PR…

【记录37】VueBaiduMap 踩坑一

截图 错误 Error in callback for watcher “position.lng”: “TypeError: Cannot read properties of undefined (reading ‘setPosition’)” 解释 回调观察程序“content”时出错&#xff1a;“TypeError:无法读取未定义的属性&#xff08;读取’setContent’&#xff09;”…

Linux部分主要命令精讲

Linux部分命令精讲 Linux命令之stat命令 stat命令简介 stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。stat命令可以查看的信息包括&#xff1a; File&#xff1a;显示文件名Size&#xff1a;显示文件大小Blocks&#xff1a;文件使用的数…

数据结构:Heap(二叉树)的基本操作

目录 1.有关二叉树必须知道的几个基本概念 2.有关二叉树的基本操作 2.0有关元素的定义以及要进行的操作 2.1初始化和销毁操作 2.2插入操作以及上调操作 2.2.1插入操作以及上调操作的图解 2.2.2插入操作以及上调操作的代码 2.3删除根元素及其下调操作 2.3.2删除根元素及…

使用AI纠正文章

我写了一段关于哲学自学的读书笔记&#xff0c;处于好奇的目的&#xff0c;让AI帮我纠正语法和逻辑。我的原文如下&#xff1a; 泰勒斯第一次提出了水是万物本源的说法&#xff0c;对于泰勒斯为什么提出这样的观点&#xff0c;或者是这样的观点是怎么来的&#xff0c;我们无从所…