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

news2024/10/7 0:51:39

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

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

目录

插入排序

插入过程

代码实现

希尔排序

希尔排序的思想

代码实现 


插入排序

插入过程

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

如图这几个数据。 

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

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

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.coloradmin.cn/o/1502066.html

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

相关文章

#onenet网络请求http(GET,POST)

参考博文&#xff1a; POST: https://blog.csdn.net/qq_43350239/article/details/104361153 POST请求&#xff08;用串口助手测试&#xff09;&#xff1a; POST /devices/1105985351/datapoints HTTP/1.1 api-key:AdbrV5kCRsKsRCfjboYOCVcF9FY Host:api.heclouds.com Con…

C++自创题目——几点了 very hard ver.

题目难度 普及 题目描述 一个老外用一口不流利的中文问你&#xff1a;“Xian zai ji dian le?”你看了一眼表&#xff0c;知道了现在是&#xff0c;你准备用这样的形式写在纸上&#xff1a; Now is m past/to h. 如果你看不懂&#xff0c;举个例子&#xff1a; 当h10&#…

python基础10_转义类型转换

这篇博客我们来学一下转义字符 首先什么是转义字符呢? 转义字符就是在编程中用于表示一些特殊的字符,比如说换行,在字符串中,需要换行吧,然后是不是有些时候还要在字符串中按tab键, 或者是enter键, 或者是引号,这些都是特殊字符,然后就是通过转义.把这些从普通字符转成具有特…

力扣面试经典150 —— 11-15题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题&#xff0c;安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题&#xff0c;文中 “数组” 通常指 python 列表&#xff1b;文中 “指针” 通常指 python 列表索引 文章目录 11. [中等] H指…

哪里可以下载动态短视频素材?短视频素材资源下载网站有哪些?

嘿&#xff0c;朋友们&#xff01;做短视频的时候&#xff0c;找到那些既有范儿又不会被告侵权的素材简直就是一项技术活。不过别担心&#xff0c;我这就给你们揭秘几个下载动态短视频素材的神秘网站&#xff0c;让你的短视频创作事半功倍&#xff01; 1&#xff0c;蛙学府资源…

ROS——VirtualBox下载

下载&安装Virtualbox Oracle VM VirtualBox 根据电脑系统版本下载。 注意&#xff1a;前提是电脑cpu要开启虚拟化 根据自己的需求下载 双击开始安装 浏览可以更改下载位置&#xff0c;默认在C盘 然后一直点&#xff0c;是或下一步就好了 下载拓展包 后续需要连接使…

直击现场 | 人大金仓携手中国大地保险上线核心超A系统

2023年底 中国大地保险 卡园三路59号办公室里 一群技术精英们正忙碌着 他们的眼中 闪烁着对即将到来的胜利的期待 这是大地保险超A系统 项目上线的关键时刻 也是通过科技创新 引领行业服务新趋势的一场征程 项目现场 #1 一次颠覆 改变传统保险服务模式 超A平台&#xff0c;是由…

房屋租赁系统|基于 Mysql+Java+JSP技术的房屋租赁系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 文末获取源码 前台首页功能 管理员功能 租户功能 房屋租赁系统结构图 数据库设计 lunwen参考 概述 源码获取 文末获取源码 前台首页功能 管理员功能 租户功能 房屋租赁系统结构图 数据库设计 lunwen参考 概述 随着科学技术的飞速发展&#xff0c;社会的方方面面…

Spring Boot搭建入门

Spring Boot简介 Spring Boot是对Spring进行的高度封装&#xff0c;是对Spring应用开发的高度简化版&#xff0c;是Spring技术栈的综合整合&#xff0c;是J2EE的一站式解决方案。想要精通Spring Boot的前提是需要熟悉Spring整套技术栈原理与内容。 Spring Boot的优点&#xf…

HTML—基本介绍

HTML是一种超文本标记语言(HyperText Markup Language)&#xff0c;用于创建网页的标记语言超文本&#xff1a;是指页面内可以包含图片、链接、声音、视频等内容标记&#xff1a;HTML富含大量的标签供程序员使用&#xff0c;通过标记符号来规定指定内容的样式 浏览器最终根据不…

2024/3/8打卡石子合并---区间动态规划问题

目录 题目&#xff1a; DP分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 设有 N 堆石子排成一排&#xff0c;其编号为 1,2,3,…,N。 每堆石子有一定的质量&#xff0c;可以用一个整数来描述&#xff0c;现在要将这 N 堆石子合并成为一堆。 每次只能合并相邻的两堆&am…

指针(一)

指针&#xff08;一&#xff09; 文章目录 前言1、内存和地址1.1.内存1.2 究竟该如何理解编制 2、指针变量和地址2.1取地址符操作符&#xff08;&&#xff09;2.2 指针变量和解引⽤操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 如何拆解指针类型2.2.3 解引⽤操作符…

Android Studio编译及调试知识

文章目录 Android Studio编译kotlin项目Android Studio编译Java和kotlin混合项目的过程gradle打印详细错误信息&#xff0c;类似这种工具的使用Android apk 从你的代码到APK打包的过程&#xff0c;APK安装到你的Android手机上的过程&#xff0c;最后安装好的形态&#xff0c;以…

20-Java备忘录模式 ( Memento Pattern )

Java备忘录模式 摘要实现范例 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象 备忘录模式属于行为型模式 摘要 1. 意图 在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对…

Win11 没有网络bug

1.问题描述 没有网络&#xff0c;dns一直是固定的&#xff0c;但是dns已经是自动获取了(MAC地址随机) 2.解决办法 1.首先&#xff0c;删除所有网络的手动dns配置,控制中心那个dns管理没有用,在设置中删除网络,不然问题还会出现 - 2.然后&#xff0c;进入注册表\HKEY_LOCAL_MACH…

第五十三回 入云龙斗法破高廉 黑旋风下井救柴进-AI训练数据处理和读取

罗真人教了公孙胜五雷天罡正法&#xff0c;并让他记住“逢幽而止&#xff0c;遇汴而环”八个字。三人辞别了罗真人&#xff0c;戴宗先回去报信&#xff0c;李逵和公孙胜结伴而行。 走了三天&#xff0c;来到了武冈镇&#xff0c;李逵碰到一个铁匠&#xff0c;叫金钱豹子汤隆&a…

docker学习进阶

一、dockerfile解析 官方文档&#xff1a; Dockerfile reference | Docker Docs 1.1、dockfile是什么&#xff1f; dockerfile是用来构建docker镜像的文本文件&#xff0c;由一条条构建镜像所需的指令和参数构成的脚本。 之前我们介绍过通过具体容器反射构建镜像(docker comm…

【硬件工程师面经整理24_其它】

文章目录 1 功放线性指标调试方法2 功放线性指标之间的关系3 光衰减器的原理4 材料硬度由什么决定&#xff1f;5 晶振市场失效率&#xff1f;6 原码、反码和补码 1 功放线性指标调试方法 调试功放线性指标的方法可以根据具体的情况和要求而有所不同&#xff0c;以下是一般性的…

html--钢琴

代码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /> <title>html钢琴</title> <script src"js/js.js"></script> <link href"…

vscode setting.json 全局设置 工作区设置 位置 优先级

vscode中setting.json有两种配置权限 一、全局配置&#xff1a;setting.json文件位于C:\Users\Administrator\AppData\Roaming\Code\User\settings.json 二、工作区配置&#xff1a;setting.json文件位于工作区的.vscode\settings.json 当两种配置同时存在时&#xff0c;工作区…