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

插入排序 与 希尔排序

六大排序之二

  • 插入排序 与 希尔排序
    • 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 直至为 1for (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;}elsebreak;}a[end + gap] = tmp;//结束后赋值}}
}

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

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

4 时间复杂度分析

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

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

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

Thanks♪(・ω・)ノ

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

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

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

相关文章

【Python动漫系列】小香香(完整代码)

文章目录 环境需求完整代码程序分析系列文章环境需求 python3.11.4及以上版本PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.…

orangepi5plus刷自编译armbian系统

准备好一个编译主机&#xff0c;配置尽量高一点。尽可能有上google的环境配置。 主要步骤 1. 克隆源码 armbian源码仓库 2. 配置apt源 更改/etc/apt/sources.list为国内源&#xff0c;比如我这里ubuntu主机配置清华源。 然后执行apt-get -y update && apt-get -y…

C# 将 Word 转化分享为电子期刊

目录 需求 方案分析 相关库引入 关键代码 Word 转 Pdf Pdf 转批量 Jpeg Jpeg 转为电子书 实现效果演示 小结 需求 曾经的一个项目&#xff0c;要求实现制作电子期刊定期发送给企业进行阅读&#xff0c;基本的需求如下&#xff1a; 1、由编辑人员使用 Microsoft Word…

听一些大神说测试前途是IT里最差的,真的是这样吗?

一&#xff1a;行业经历 测试行业爬模滚打7年&#xff0c;从点点点的功能测试到现在成为高级测试&#xff0c;工资也翻了几倍&#xff1b;个人觉得&#xff0c;测试的前景并不差&#xff0c;只要自己肯努力&#xff1b;我刚出来的时候是在鹅厂做外包的功能测试&#xff0c;天天…

Java 栈和队列的交互实现

文章目录 队列和栈的区别一.用队列模拟实现栈1.1入栈1.2出栈1.3返回栈顶元素1.4判断栈是否为空 二.用栈模拟实现队列2.1 入队2.2出队2.3peek2.4判断队列是否为空 三.完整代码3.1 队列模拟实现栈3.2栈模拟实现队列 队列和栈的区别 栈和队列都是常用的数据结构&#xff0c;它们的…

logging模块

【 一 】前言 logging 模块是 Python 中用于记录日志信息的标准库模块。通过使用 logging 模块&#xff0c;你可以在应用程序中设置日志记录以追踪代码执行、错误报告等信息。 debug : 打印全部的日志( notset 等同于 debug )info : 打印 info, warning, error, critical 级别的…

MongoDB的原子操作findAndModify和findOneAndUpdate

本文主要介绍MongoDB的原子操作findAndModify和findOneAndUpdate。 目录 MongoDB的原子操作一、findAndModify二、findOneAndUpdate MongoDB的原子操作 MongoDB的原子操作指的是在单个操作中对数据库的数据进行读取和修改&#xff0c;并确保操作是原子的&#xff0c;即要么完全…

探讨小鹏汽车CAN通讯协议分析破解过程数据研究技术应用

当前新能源电动汽车设计日益复杂&#xff0c;为提高舒适性、功能性、提升性能和确保更高的安全性&#xff0c;很多汽车的设计中融入了更复杂的功能。包括了雷达、激光雷达、自适应巡航、L2以上自动驾驶系统&#xff0c;高级驾驶辅助系统、盲区监测等等。安装在汽车上的传感器和…

元宇宙3d展厅全景导览系统为现代展会的举办带来了全新的可能性和机遇。

3D元宇宙展会搭建平台的亮点 随着科技的不断进步&#xff0c;3D元宇宙展会搭建平台已经成为了现代展会的新趋势。这种全新的展会形式不仅给人们带来了前所未有的视觉体验&#xff0c;还具备许多亮点和优势&#xff0c;让展会的举办更加高效、便捷和创新。 一、突破时空限制 3D元…

Power BI案例-医院数据集的仪表盘制作

数据集描述 医生数据集doctor 医生编号是唯一的&#xff0c;名称会存在重复 医疗项目数据projects 病例编号是唯一的&#xff0c;注意这个日期编号不是真正的日期。 日期数据date 这里的日期编号对应医疗项目数据中的日期编号 科室数据集Department 维度表 采购成本事实表…

基于vue-cli快速发布vue npm 包

一、编写组件 1. 初始化项目并运行 vue create vue-digital-countnpm run serve2. 组件封装 新建package文件夹 ​ 因为我们可能会封装多个组件&#xff0c;所以在src下面新建一个package文件夹用来存放所有需要上传的组件。 ​ 当然&#xff0c;如果只有一个组件&#xff…

用户管理第2节课--idea 2023.2 后端规整项目目录

目的&#xff1a;当项目文件多了之后&#xff0c;咱们也能够非常清晰的去找到代码的一个目录 一、项目规整了两大处 1.1 com.yupi.usercenter & resources 二、具体操作 com.daisy.usercenter 2.1 原版 & 鱼皮有出入&#xff0c;demos.web就不删除了 原因&#…