【六大排序详解】开篇 :插入排序 与 希尔排序

news2024/9/25 11:19:42

插入排序 与 希尔排序

六大排序之二

  • 插入排序 与 希尔排序
    • 1 排序
      • 1.1排序的概念
    • 2 插入排序
      • 2.1 插入排序原理
      • 2.2 排序步骤
      • 2.3 代码实现
    • 3 希尔排序
      • 3.1 希尔排序原理
      • 3.2 排序步骤
      • 3.3 代码实现
    • 4 时间复杂度分析
  • Thanks♪(・ω・)ノ
  • 下一篇文章见!!!!!!!

1 排序

1.1排序的概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
排序存在稳定性,稳定性是评估排序的重要标准。
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
排序可以概括为两大类 、六大排序:
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
六大排序
这篇文章我们先介绍插入排序。

2 插入排序

2.1 插入排序原理

生活中最常见的插入排序就是扑克牌,我们一张一张的拿出来,比较然后放在合适位置。所用思想就是插入排序:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
在这里插入图片描述

2.2 排序步骤

  1. 从第一个元素开始,默认已经有序
  2. 取后一个元素tmp ,开始向前扫描
  3. (升序)如果有序序列的最后一个元素大于tmp , 有序序列结尾下标向前移动
  4. 重复 3 步骤,直到有序序列最后一个元素小于tmp
  5. 插入tmp在该有序序列后。
  6. 再取数组下一个元素,重复 1-5 步骤
    在这里插入图片描述

2.3 代码实现

// 插入排序
void InsertSort(int* a, int n) {

	for (int i = 0; i < n - 1; i++) {
		int end = i;//记录有序部分的最后下标
		int tmp = a[end + 1];//被排序数

		while (end >= 0) {
			if (a[end] > tmp) {//如果有序部分最大值大于被排序数,有序下标--
				a[end + 1] = a[end];
				end--;
			}
			else//如果有序部分最大值小于被排序数,直接退出。
				break;
		}
		//在比被排序数小的有序部分后赋值
		a[end + 1] = tmp;
	}
}

功能实现效果,非常nice。
在这里插入图片描述
直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高。
  2. 时间复杂度:O(N^2) 。
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定

3 希尔排序

3.1 希尔排序原理

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

根据插入排序的特性 元素集合越接近有序,直接插入排序算法的时间效率越高。,我们进行多次不同gap的插入排序,使其逐渐有序。进而时间复杂度更低。
插入排序可以视为特殊的希尔排序。

3.2 排序步骤

  1. 选定gap值,并分组进行预排序
  2. 每组进行插入排序,使序列变得更加有序。
  3. gap值变小(务必保证最后一次是gap==1
  4. 重复 1 - 3 步骤,直到gap为1。
  5. 排序完成。
    在这里插入图片描述

3.3 代码实现

// 希尔排序
void ShellSort(int* a, int n) {
	int gap = n;//设置初始gap值
	while (gap > 1) {
		gap = gap / 2;//每次除2 直至为 1
      
		for (int i = 0; i < n - gap; i++) {//每组插入排序

			int end = i;
			int tmp = a[end + gap];

			while (end >= 0) {
				if (a[end] > tmp) {
					a[end + gap] = a[end];
					end -= gap;
				}
				else
					break;
			}
			a[end + gap] = tmp;//结束后赋值
		}
	}
}

运行查看效果,very good!
在这里插入图片描述
希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就
    会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的
    希尔排序的时间复杂度都不固定:

4 时间复杂度分析

我们设计一个100000个数据测试函数,来检测一下插入排序,希尔排序的时间复杂度(以冒泡排序为对照组)。
请看下面测试效果:

在这里插入图片描述
这里希尔排序有非常明显的优势,运算非常之快,其次为插入排序。普通的冒泡排序在这里就像蝼蚁一般。

至于希尔排序的时间复杂度目前还没有证明。大概为n^1.3。下面是殷老师的观点。
在这里插入图片描述

Thanks♪(・ω・)ノ

下一篇文章见!!!!!!!

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

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

相关文章

统计分析绘图软件 GraphPad Prism 10 mac功能介绍

GraphPad Prism mac是一款专业的统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。 GraphPad Prism mac功能和特点 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数据。用户可以轻松地…

MySQL——表的增删查改

目录 一.Create&#xff08;创建&#xff09; 1.单行数据 全列插入 2.多行数据 指定列插入 3.插入否则更新 4. 替换 二.Retrieve&#xff08;读取&#xff09; 1. select 列 查询 2.where 条件 3.结果排序 4.筛选分页结果 三.Update &#xff08;修改&#xff09;…

ROS学习笔记(七)---参数服务器

ROS学习笔记文章目录 01. ROS学习笔记(一)—Linux安装VScode 02. ROS学习笔记(二)—使用 VScode 开发 ROS 的Python程序&#xff08;简例&#xff09; 03. ROS学习笔记(三)—好用的终端Terminator 04. ROS学习笔记(四)—使用 VScode 启动launch文件运行多个节点 05. ROS学习笔…

SMARTFORMS打印问题

一、问题概述 项目中碰到EPSON针式打印机&#xff0c;SAP打印出来的三单合一&#xff0c;是想横向打印&#xff0c;结果不管怎么设置打印出来都是纵向的&#xff1b; 二、调整 1、首先调整SMARTFORMS的打印方向&#xff0c;使用T-CODE:SMARTFORMS&#xff0c;如下图&#xf…

嵌入式串口输入详细实例

学习目标 掌握串口初始化流程掌握串口输出单个字符掌握串口输出字符串掌握通过串口printf熟练掌握串口开发流程学习内容 需求 串口循环输出内容到PC机。 串口数据发送 添加Usart功能。 首先,选中Firmware,鼠标右键,点击Manage Project Items 接着,将gd32f4xx_usart.c添…

Dokit 开源库:简化 Android 应用开发的利器

Dokit 开源库&#xff1a;简化 Android 应用开发的利器 一、Dokit 简介二、Dokit 功能三、Dokit 使用3.1 DoKit Android 最新版本3.2 DoKit Android 接入步骤 四、总结 在 Android 应用开发过程中&#xff0c;我们经常需要处理调试、性能优化和用户体验等方面的问题。然而&…

【python】进阶--->并发编程之协程

一、协程 是另外一种实现多任务的方式,只不过比线程占用更小的执行单元(需要的资源).因为它自带cpu上下文,就可以在合适的时机,从一个协程切换到另一个协程. (任务数量多于cpu时)系统在很短的时间内,将cpu轮流分配给不同的任务执行,造成了多任务同时运行的错觉.而每个任务在运行…

全面解析找不到xinput1_3.dll无法继续执行代码的多种解决方案(实用教程)

xinput1_3.dll文件是什么&#xff1f; xinput1_3.dll是一个动态链接库文件&#xff0c;它是DirectInput的组件之一。DirectInput是微软公司开发的一种输入设备驱动程序&#xff0c;用于处理游戏控制器、键盘、鼠标等输入设备的信号。xinput1_3.dll文件主要负责处理游戏控制器的…

年终汇报这么写,升值加薪必有你!

#01 你这么能干&#xff0c; 老板知道吗&#xff1f; — 打工人最怕什么&#xff1f; 最怕你忙前忙后&#xff0c;干活一大堆&#xff0c;气出一身结节&#xff0c;锅还没少背&#xff0c;最后升职加薪没有你&#xff0c;出国旅游不带你&#xff1b;更怕你日常996&#xf…

C语言归并排序(合并排序)算法以及代码

合并排序是采用分治法&#xff0c;先将无序序列划分为有序子序列&#xff0c;再将有序子序列合并成一个有序序列的有效的排序算法。 原理&#xff1a;先将无序序列利用二分法划分为子序列&#xff0c;直至每个子序列只有一个元素(单元素序列必有序)&#xff0c;然后再对有序子序…

HTML5+CSS3小实例:纯CSS实现锚点平滑过渡

实例:纯CSS实现锚点平滑过渡 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"&…

宠物干货类软文怎么写?媒介盒子分享

虽然近年来生育率有所减少&#xff0c;但是养宠物的人却大大增加&#xff0c;随之而来的宠物经济也是一个值得关注的点。做宠物生意想要脱颖而出&#xff0c;可以依靠软文营销&#xff0c;其中宠物干货类软文由于其价值性能够带来较高的转化率今天媒介盒子主要来和大家聊聊宠物…

QT 前端技术 QSS(1)

伪装态是指当鼠标悬停在按钮上的时候&#xff0c;按钮的字体背景颜色等会发生改变。 这句话意思在this里面找到QTextEdit控件#后面表示指定的控件名称就是从所有QTextEdit中选出叫做lbsize的QTextEdit并对其进行后面的操作。 如果将QTextEdit#lbsize删除的话就是将this中全部的…

c语言编写http服务器(Linux下运行)

参考文章&#xff1a;https://blog.csdn.net/baixingyubxy/article/details/125964986?spm1001.2014.3001.5506 上面是详细讲解&#xff0c;我这篇是总结了他的代码&#xff0c;因为他没给整体代码 所有代码&#xff1a; #include <stdio.h> #include <stdlib.h&g…

echarts地图map点击某一区域设置选中颜色/select选中文字颜色设置无效

选中区域为红色&#xff0c;字体为白色 1.selectedMode: ‘single’,设置单选&#xff0c;多选&#xff0c;不选中 2.series/map/select属性 series: [{type: map,map: area,//单选selectedMode: single,aspectScale: 0.73,layoutCenter: [50%, 51%], //地图位置layoutSize: …

CEC2013(python):五种算法(OOA、WOA、GWO、DBO、HHO)求解CEC2013(python代码)

一、五种算法简介 1、鱼鹰优化算法OOA 2、鲸鱼优化算法WOA 3、灰狼优化算法GWO 4、蜣螂优化算法DBO 5、哈里斯鹰优化算法HHO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff1a; [1] Liang J J , Qu B Y , Suganthan P N , et al. Pro…

量子登月计划!Infleqtion与日本JST研发中性原子量子计算机

​&#xff08;图片来源&#xff1a;网络&#xff09; 美国量子信息公司Infleqtion&#xff0c;已被日本科学技术振兴机构&#xff08;JST&#xff09;选定为“量子登月计划”唯一的外国量子计算合作伙伴。该计划旨在增强日本的量子技术能力&#xff0c;预计将在2050年之前对日…

WinDbg调试异常(!!! second chance !!!)

以前使用windbg调试样本时不时会遇到异常并提示(!!! second chance !!!),之前也尝试查找过原因但是并没有找到,一直十分郁闷。这次又出现了异常,有时间查找原因并发现了问题所在,于是记录下分析过程。 起因 在调试一个样本,每次用windbg调试都会出现: 但是使用x64dbg调…

java-sec-code中jwt

java-sec-code中jwt jwt漏洞首先需要爆破出密钥&#xff0c;然后在进行伪造&#xff0c;由于这里是白盒&#xff0c;不做爆破演示&#xff0c;直接利用 创建jwt属性值 http://127.0.0.1:8080/jwt/createToken从jwt属性值中解密获取user值 http://127.0.0.1:8080/jwt/getName…

docker安装sonar后集成本地代码进行质量分析

背景 在完成代码后&#xff0c;想做一个较低层级的代码自检&#xff0c;来完善自己代码的质量 技术选型 在结合现有项目情况下&#xff0c;结合Jenkins走CI CD过程&#xff0c;选择了sonarqube 安装 下载地址:自己搜 安装教程我来出,首先sonarqube完整的过程分了两部分&…