【数据结构常见七大排序(一)】—插入排序篇【直接插入排序】And【希尔排序】

目录

  • 1.排序的概念及其运用
    • 1.1排序的概念
    • 1.2排序运用
    • ​​​​​​​​​​​​​​​​​​​​​1.3常见的七大排序
  • ​​2.直接插入排序
    • 2.1基本思想
    • ​​2.2直接插入排序
    • 2.3动图助解
    • 2.4直接插入排序源码
    • ​2.5直接插入排序的特性总结
  • ​​3.希尔排序( 缩小增量排序 )
    • ​​3.1希尔排序概念及思想
    • 3.2希尔排序图解​​
    • ​3.3希尔排序源码
    • 3.4希尔排序的两种预排序图解
    • 3.5希尔排序的特性总结

在这里插入图片描述

1.排序的概念及其运用

1.1排序的概念

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

1.2排序运用

在这里插入图片描述


​​​​​​​​​​​​​​​​​​​​​1.3常见的七大排序

​​
在这里插入图片描述


​​2.直接插入排序

从1.3的图中我们也可以发现插入排序有两种类型—【直接插入排序】、【希尔排序】 它们都属于插入排序,希尔排序是直接插入排序的优化形式。


2.1基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。


​​实际中我们玩扑克牌时,就用了插入排序的思想

在这里插入图片描述


​​2.2直接插入排序

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。


2.3动图助解

插入排序动图


2.4直接插入排序源码

void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; ++i){// [0,end]有序,把end+1位置的值插入,保持有序int end = i;int tmp = a[end + 1];//插入的值和前面[0,end]的值进行比较while (end >= 0){if (tmp < a[end])//插入的值小,就往前挪一下{a[end + 1] = a[end];--end;}else//到这里就是数组中的值<插入的值 || 整个[0,end]的值都>插入的值{break;}}a[end + 1] = tmp;//放入插入值}
}

​2.5直接插入排序的特性总结

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高

                     ①最优:顺序有序/接近顺序有序 —O(N)
    
  2. 时间复杂度

                       ②最坏:逆序—O(N^2)
    
  3. 空间复杂度:O(1),它是一种稳定的排序算法

  4. 稳定性:稳定


​​3.希尔排序( 缩小增量排序 )

【希尔排序】是对上面【直接插入排序】的最坏情况进行优化。

​​3.1希尔排序概念及思想

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


3.2希尔排序图解​​

在这里插入图片描述


​【希尔排序】And【直接插入排序】单趟排序的区别
在这里插入图片描述


​3.3希尔排序源码

void ShellSort(int* a, int n)
{//方法一:双层循环(不太推荐)/*int gap = 3;*//*for (int j = 0; j < gap; ++j){for (int i = j; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}*/
/////方法二:单层for循环(推荐)// gap > 1时是预排序// gap 最后一次等于1,是直接插入排序int gap = n;while (gap > 1){gap = gap / 3 + 1;//保证最后一次gap=1,就是【直接插入排序】了。for (int i = 0; i < n - gap; ++i){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

3.4希尔排序的两种预排序图解

方法一【双层for循环控制】

这种排序将这个数组分成3组数

(红色)——9 6 4 1

(蓝色)——8 5 3

(紫色)——7 5 2

排序的顺序是先排序完红色的4个数,再排序蓝色的3个数,最后排序紫色的3个数

在这里插入图片描述
方法二【单层for循环控制】

这个方法下,就是排序完红色的第1个数,再排序完蓝色的第1个数,最后排序紫色的第1个数—在轮到红色的第2个数…

在这里插入图片描述


3.5希尔排序的特性总结

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

4.希尔排序的时间复杂度都不固定:这边给个大概的平均时间复杂度—O(N^1.3)


在这里插入图片描述在这里插入图片描述

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

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

相关文章

STM32CubeMX X-CUBE-AI更新模型

如题&#xff0c;我采用一个采用stm32CUBEMX生成了工程&#xff0c;工程里面使用了X-CUBE-AI对自定义的模型进行模型压缩&#xff0c;但是我经常要更新模型&#xff0c;那么怎样更新模型了。这里开博客记录一下。 如图所示&#xff0c;为基于STM32CUBEMX生成的工程文件目录结构…

C/C++ 程序 IDE 开发工具 CLion

下载地址&#xff1a; https://www.jetbrains.com/clion/ https://www.jetbrains.com/clion/ 下载地址&#xff1a; https://www.jetbrains.com/clion/download/ https://www.jetbrains.com/clion/download/ 历史版本&#xff08;老版本&#xff09;下载地址&#xff1a; h…

TCP/IP网络编程 第二十章:Windows中的线程同步

同步方法的分类及CRITICAL_SECTION同步 用户模式&#xff08;User mode)和内核模式&#xff08;Kernal mode&#xff09; Windows操作系统的运行方式是“双模式操作”&#xff08;Dual-mode Operation&#xff09;,这意味着Windows在运行过程中存在如下2种模式。 □用户模式&…

【分布式学习】服务注册与发现:Eureka、zk、Nacos、Consul对比

服务发现框架对比 –NacosEurekaConsulCoreDNSZookeeper一致性协议CPAPAPCP—CP健康检查TCP/HTTP/MYSQL/Client BeatClient BeatTCP/HTTP/gRPC/Cmd—Keep Alive负载均衡策略权重/metadata/SelectorRibbonFabioRoundRobin—雪崩保护有有无无无自动注销实例支持支持不支持不支持…

预处理过程(2/13)

头文件包含&#xff1a;#include定义一个宏&#xff1a;#define条件编译&#xff1a;#if、#else、#endif编译控制&#xff1a;#pragma 编译器提供的这些预处理命令&#xff0c;大大方便了程序的编写&#xff1a;通过头文件包含可以实现模块化编程&#xff1b;使用宏可以定义一…

关于正则表达式的简单介绍以及使用

一、介绍 正则表达式通常被用来检索匹配某种模式&#xff08;规律&#xff09;的文本 日常文本检索&#xff0c;如果单纯检索某个数字&#xff0c;字母&#xff0c;或者单词匹配出来的结果较多&#xff0c;而面对目标文件内容较大的时&#xff0c;我们也不可能肉眼对检索出来的…

JavaCV error AAC with no global headers is currently not supported

当我使用JavaCV库&#xff08;FFmpegFrameGrabber FFmpegFrameRecorde&#xff09;尝试将dhav码流转为rtsp的时候&#xff0c;出现了以下报错&#xff1a; Error: [rtsp 0000002318df7c30] AAC with no global headers is currently not supported.Exception in thread &quo…

leetcode 542. 01 矩阵

给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1&#xff1a; 输入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff1a;[[0,0,0],…

docker安装yapi

一&#xff1a;创建docker-compose.yml 创建docker-compose.yml文件&#xff0c;具体内容如下&#xff1a; version: 3services:yapi-web:image: jayfong/yapi #拉取镜像container_name: yapi-web #容器名称ports: - 3000:3000 #端口映射environment:- YAPI_ADMIN_ACCOUN…

解锁新技能《logback packagingData属性配置作用及源码分析》

开源SDK: <dependency><groupId>io.github.mingyang66</groupId><artifactId>oceansky-logger</artifactId><version>4.3.6</version> </dependency> <!-- 基于logback的日志组件SDK --> <dependency><grou…

Hadoop——Hadoop单机搭建问题汇总

1、org.apache.hadoop.security.AccessControlException: Permission denied: userroot... 解决方法&#xff1a;关闭Hadoop,在hdfs-site.xml文件中添加&#xff1a; <property><name>dfs.permissions</name><value>false</value> </proper…

【Unity2D】设置一物体默认在其他物体之上不被遮挡

比如我想让机器人显示在箱子的前面。 点击箱子&#xff0c;将其层级设置在机器人的后面。 即修改箱子的Order in Layer 在机器人之后 物体默认的Order in Layer 都是0 &#xff0c;将箱子的Order in Layer修改为-1即可 这样将确保先绘制机器人&#xff0c;然后绘制箱子。这样…

C#鼠标拖拽,移动图片实例

最近工作需要做一个鼠标可以拖拽移动图片的功能。 写了几个基本功能&#xff0c;勉强能用。这里记录一下。欢迎大神补充。 这个就是完成的功能。 下边的绿色是一个pictureBox&#xff0c;白色框也是一个pictureBox&#xff0c;他们二者是子父级关系。 绿色是父级&#xff0c…

【图论】最短路算法

1、Dijkstra算法 不能处理边权为负的情况&#xff0c;复杂度O(nlogn) 步骤与基本思路 &#xff08;1&#xff09;初始化距离数组dist[N]&#xff0c;将其所有值赋为0x3f&#xff0c;并将起点1的dist初始化为0&#xff0c;存入优先队列heap中 &#xff08;2&#xff09;从所…

shell编程之正则表达式

正则表达式&#xff1a;由一类特殊的字符以及文本字符所编写的一种模式&#xff0c;处理文本当中的内容 其中的一些字符不表示字符的字面含义&#xff0c;表示控制或者通配的功能 通配符&#xff1a;匹配文件名和目录名&#xff0c;不能匹配文件的内容 正则表达式&#xff1a;可…

STM32 BOOTLOADER配置以及APP跳转实现(裸机)

配置实现环境:KEIL 一、STM32BootLoader配置 Bootloader: Bootloader是硬件启动的引导程序,是运行操作系统的前提。在操作系统内核或用户应用程序运行之前运行的一段小代码。对硬件进行相应的初始化和设定,最终为操作系统准备好环境。 APP:APP就是我们的应用程序,经过硬件…

NAS私有云存储 - 搭建Nextcloud私有云盘并公网远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文…

Centos Certbot 使用

安装 可选配置&#xff1a;启动EPEL存储库 非必要项 yum install -y epel-release yum clean all yum makecache #启用可选通道 可以不配置 yum -y install yum-utils yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional必要配置…

【《Spring Boot微服务实战(第2版)》——一本关于如何在Spring Boot中构建微服务的全面指南】

使用Spring Boot框架构建基于Java的微服务架构&#xff0c;将应用程序从小型单体架构蜕变为由多个服务组成的事件驱动架构。这个最新版本围绕服务发现、负载均衡、路由、集中式日志、按环境配置和容器化等知识点&#xff0c;循序渐进地讲述微服务架构、测试驱动的开发和分布式系…

Mysql 主从复制、读写分离

目录 一、前言&#xff1a; 二、主从复制原理 2.1 MySQL的复制类型 2.2 MySQL主从复制的工作过程; 2.2.1 MySQL主从复制延迟 2.3 MySQL 有几种同步方式&#xff1a; 三种 2.3.1、异步复制&#xff08;Async Replication&#xff09; 2.3.2、同步复制&#xff08;Sync Re…