20-数据结构-内部排序-插入排序

简介:插入排序基本有两步,先是通过比较,得到插入位置,随后移动给需要插入的位置处腾空,最后进行值的插入。

目录

一、直接插入排序

1.1简介:

1.2代码

二、折半插入排序

2.1简介:

2.2代码:

三、希尔排序

3.1简介:

3.2.代码:

四、总代码

一、直接插入排序

1.1简介:

        直接插入排序,主要两步,先找到需要插入的位置,随后进行移动,给位置腾空,最后赋值。其主要思想都在注释里,

        直接插入排序适合:顺序存储和链式存储

        稳定性:稳定,因为是根据位置直接插入的,所以前后位置不会变。(口令:稳稳的幸福,鸡毛插龟壳-(基数排序,冒泡排序,直接插入和折半插入,归并排序))

        时间复杂度:最好的情况为O(n),已经排好序列了,最坏情况为O(n^{2}),从头到尾每一个数都需要移动判断,

        空间复杂度:O(1)

1.2代码

void InsertSort(int *a,int n)
{//传进数组和实际数据个数 int i,j;for(i=2;i<=n;++i){//查找实际需要插入的位置i if(a[i]<a[i-1])//因为按照递增顺序排,因此发现后面比前面小的情况就需要排序否则跳过,换下一个数据判断 {a[0]=a[i];//哨兵处放实际需要排的值,方便后面比较 for(j=i-1;a[j]>a[0];--j)//因为需要插入数据进行排序,因此需要从后往前后移,给插入的位置腾空移位置 {//给需要存放位置前的位置处,往后移动,腾空位置,当j所指的数据小于等于哨兵时,给哨兵处的值放在j+1位置处即可 a[j+1]=a[j];}//给数据插进腾空的地方。 a[j+1]=a[0];}}
}

二、折半插入排序

2.1简介:

        折半插入是对直接插入的优化,减少了关键字对比的次数,但时间复杂度和空间复杂度和一直插入一样,移动次数没有改变,仅仅减少比较次数,比较次数取决于表中元素n。

        折半插入排序思想是,从第二个元素开始折半查找进行判断,找到该元素需要插入的位置,随后,进行折半查找,最后折半查找结束后low和high紧挨着互换左右位置,low处为需要插入的位置,随后进行移动,把low处及其后面的都往后移动,最后给a[low]=a[0],赋值即可。

2.2代码:

void InsertHalfSort(int *a,int n)
{int i,j,low,high,mid;//对数组进行排序,先用折半法,查找位置 for(i=2;i<=n;i++){a[0]=a[i];//从第二个数据开始判断比较 low=1;high=i-1;while(low<=high)//查找区间,最后查找完成后low和high左右挨着互换,high+1即low位置处为需要插入的地方 {mid=(low+high)/2;if(a[mid]<a[0])low=mid+1;elsehigh=mid-1;}//折半后,此时low及其之后的数据都是比high处大的,而low位置处为需要插入的地方,因此需要给low机器后面的地方进行后移,给low处数据弄空 for(j=i-1;j>=low;--j){a[j+1]=a[j];}a[low]=a[0];}
}

三、希尔排序

3.1简介:

        希尔不同于直接插入和折半,而是给表分割成无数子表,一趟一趟分割,合并,每一次分割的子表之间进行判断,以及排序移动,最后一趟趟汇总。每趟子表下标为i,i+d

空间复杂度仍未O(1)

时间复杂度为O(n^{1.3}),坏的情况下是O(n^{2})

稳定性:不稳定

适用性:仅适合于顺序存储。需要随机访问支持才行。

3.2.代码:

void ShellSort(int *a,int n)
{int i,j,d;//d为每次增量,随后d每次/2 for(d=n/2;d>=1;d=d/2) //d增量的趟次 {//开始比较, 从第一趟中,第一个比较队中来说,都是从比较队中第二个数据开始与前面的对比,前面的是i-d for(i=d+1;i<=n;i++)//第一个比较队完成后,i++,进行第二个比较队 {if(a[i]<a[i-d])//按递增比较的话,如果后面的比前面的小,那么异常进行记录和交换 {a[0]=a[i];for(j=i-d; j>=0&&a[j]>a[0] ;j=j-d) //随后从队中第一个数据开始,往后移动,移动到它的下一位j+d处。判断条件为j大于0,且当前的值比移动的值大时,进行数据的后移 {a[j+d]=a[j];	}//移动完毕,进行赋值,此时两两交换完成 a[j+d]=a[0];}				}	}	} 

四、总代码

#include <stdio.h>
//插入排序——直接插入排序
void InsertSort(int *a,int n)
{//传进数组和实际数据个数 int i,j;for(i=2;i<=n;++i){//查找实际需要插入的位置i if(a[i]<a[i-1])//因为按照递增顺序排,因此发现后面比前面小的情况就需要排序否则跳过,换下一个数据判断 {a[0]=a[i];//哨兵处放实际需要排的值,方便后面比较 for(j=i-1;a[j]>a[0];--j)//因为需要插入数据进行排序,因此需要从后往前后移,给插入的位置腾空移位置 {//给需要存放位置前的位置处,往后移动,腾空位置,当j所指的数据小于等于哨兵时,给哨兵处的值放在j+1位置处即可 a[j+1]=a[j];}//给数据插进腾空的地方。 a[j+1]=a[0];}}
}
//插入排序——折半插入
void InsertHalfSort(int *a,int n)
{int i,j,low,high,mid;//对数组进行排序,先用折半法,查找位置 for(i=2;i<=n;i++){a[0]=a[i];//从第二个数据开始判断比较 low=1;high=i-1;while(low<=high)//查找区间,最后查找完成后low和high左右挨着互换,high+1即low位置处为需要插入的地方 {mid=(low+high)/2;if(a[mid]<a[0])low=mid+1;elsehigh=mid-1;}//折半后,此时low及其之后的数据都是比high处大的,而low位置处为需要插入的地方,因此需要给low机器后面的地方进行后移,给low处数据弄空 for(j=i-1;j>=low;--j){a[j+1]=a[j];}a[low]=a[0];}
}
//插入排序——希尔排序:
void ShellSort(int *a,int n)
{int i,j,d;//d为每次增量,随后d每次/2 for(d=n/2;d>=1;d=d/2) //d增量的趟次 {//开始比较, 从第一趟中,第一个比较队中来说,都是从比较队中第二个数据开始与前面的对比,前面的是i-d for(i=d+1;i<=n;i++)//第一个比较队完成后,i++,进行第二个比较队 {if(a[i]<a[i-d])//按递增比较的话,如果后面的比前面的小,那么异常进行记录和交换 {a[0]=a[i];for(j=i-d; j>=0&&a[j]>a[0] ;j=j-d) //随后从队中第一个数据开始,往后移动,移动到它的下一位j+d处。判断条件为j大于0,且当前的值比移动的值大时,进行数据的后移 {a[j+d]=a[j];	}//移动完毕,进行赋值,此时两两交换完成 a[j+d]=a[0];}				}	}	} //打印
void PrintSort(int *a,int n)
{int i;for(i=1;i<=n;i++){printf("%d ",a[i]);	}	printf("\n"); 
} int main()
{int a[9]={0,49,38,65,97,76,13,27};int size=7;printf("开始值\n");PrintSort(a,size);//插入6进去int x;printf("请输入插入的值\n"); scanf("%d",&x); a[size+1]=x; size++;printf("\插入后排序\n");
//	InsertSort(a,size);//直接插入排序 
//	InsertHalfSort(a,size);//折半插入排序 ShellSort(a,size);//希尔排序 PrintSort(a,size);} 

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

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

相关文章

LXC、Docker、 Kubernetes 容器以及Hypervisor的区别

LXC、Docker、 Kubernetes 容器以及Hypervisor的区别 SaaS: Software-as-a-Service&#xff08;软件即服务&#xff09; PaaS: Platform-as-a-Service&#xff08;平台即服务&#xff09; IaaS: Infrastructure-as-a-Service&#xff08;基础设施即服务&#xff09; 1、Docke…

如何使用 Disco 将黑白照片彩色化

Disco 是一个基于视觉语言模型&#xff08;LLM&#xff09;的图像彩色化工具。它使用 LLM 来生成彩色图像&#xff0c;这些图像与原始黑白图像相似。 本文将介绍如何使用 Disco 将黑白照片彩色化。 使用 Disco 提供了一个简单的在线演示&#xff0c;可以用于测试模型。 访问…

SpringMVC之国际化上传下载

spring项目中的国际化 1&#xff09;提供中英两种资源文件 i18n_en_US.properties i18n_zh_CN.properties 2&#xff09;配置国际化资源文件&#xff08;在spring配置文件中添加&#xff0c;例如spring-mvc.xml&#xff09; <bean id"messageSource" class&quo…

从头开始机器学习:神经网络

一、说明 如果你还没有做过逻辑回归&#xff0c;你会在这里挣扎。我强烈建议在开始之前查看它。您在逻辑回归方面的能力将影响您学习神经网络的难易程度和速度。 二、神经网络简介 神经网络是一个神经元网络。这些神经元是逻辑回归函数&#xff0c;它们被链接在一起形成一个网络…

使用REPLACE将数据库某一列字段进行字符串操作

REPLACE可以将表里的数据进行替换操作 如&#xff1a;需要把这一列里面的 # 去掉&#xff0c;经过测试&#xff0c;无论是开头、句中还是结尾都可以删除 UPDATE 表名 SET 字段名 REPLACE(字段名 , #, )

C#上位机序列9: 批量读写+事件广播

1. 读取配置文件及创建变量信息&#xff08;点位名称&#xff0c;地址&#xff0c;数据类型&#xff08;bool/short/int/float/long/double&#xff09;&#xff09; 2. 读任务&写任务,数据有变化时事件广播通知 using HslCommunication; using HslCommunication.Core; usi…

IOday7

A进程 #include <head.h> int main(int argc, const char *argv[]) {pid_t cpidfork();if(cpid>0)//父进程向管道文件2写{ int wfd;if((wfdopen("./myfifo2",O_WRONLY))-1){ERR_MSG("open");return -1;} char buf[128]"";while(1){bze…

进阶JAVA篇-异常处理:解读与解决编程中的意外情况

目录 1.0 什么是异常&#xff1f; 1.1 异常主要分为两个情况分别是运行时异常、编译时异常。 2.0 怎么处理异常呢&#xff1f; 2.1 捕获异常&#xff08;Catch Exception&#xff09; 2.2 声明异常&#xff08;Declare Exception&#xff09; 3.0 自定义异常 3.1 如何定义异常类…

Linux:进程控制

目录 一、进程创建 写时拷贝 二、进程终止 echo $? 如何终止进程 _exit与exit 三、进程等待 进程等待的必要性 进程等待的操作 wait waitpid status 异常退出情况 status相关宏 options 四、进程程序替换 1、关于进程程序替换 2、如何进行进程程序替换 程序…

【深度学习】【Opencv】【GPU】python/C++调用onnx模型【基础】

【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【Opencv】【GPU】python/C调用onnx模型【基础】前言Python版本OpenCVWindows平台安装OpenCVopencv调用onnx模型 C版本…

vue 自定义指令

vue 自定义指令 指令 和mounted 是什么关系 &#xff1f; **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day05\准备代码\04-自定…

反转链表(java)

大家好我是苏麟今天说一说链表常见的简单题目 . BM1 反转链表 牛客BM1 反转链表 : 描述 : 给定一个单链表的头结点(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 分析 : …

云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露

文章目录 云原生-K8s安全-etcd未授权访问云原生-K8s安全-Dashboard未授权访问云原生-K8s安全-Configfile鉴权文件泄漏云原生-K8s安全-Kubectl Proxy不安全配置 云原生-K8s安全-etcd未授权访问 攻击2379端口&#xff1a;默认通过证书认证&#xff0c;主要存放节点的数据&#x…

【Linux-常用命令-基础命令-复制-copy-命令-笔记】

【Linux-常用命令-基础命令-复制文件-copy-命令-笔记】 1、前言2、操作3、自己的实践 1、前言 最近&#xff0c;在使用Linux的时&#xff0c;使用相关基础命令是&#xff0c;总是容易忘记&#xff0c;上网一搜&#xff0c;大部分都写的比较繁琐&#xff0c;我就找下复制命令&a…

Anylogic 读取和写入Excel文件

1、选择面板-连接-Excel文件&#xff0c;拖入到视图中 然后在excel文件的属性中进行绑定外部excel文件。 绑定完之后&#xff0c;在你需要读取的地方进行写代码&#xff0c; //定义开始读取的行数 //这里设为2&#xff0c;是因为第一行是数据名称 int row12; //读取excel文件信…

[开源]MIT开源协议,基于Vue3.x可视化拖拽编辑,页面生成工具

一、开源项目简介 AS-Editor 基于 Vue3.x 可视化拖拽编辑&#xff0c;页面生成工具。提升前端开发效率&#xff0c;可集成至移动端项目作为通过定义 JSON 直接生成 UI 界面。 二、开源协议 使用MIT开源协议 三、界面展示 四、功能概述 基于Vue可视化拖拽编辑&#xff0c;…

Web3 整理React项目 导入Web3 并获取区块链信息

上文 WEB3 创建React前端Dapp环境并整合solidity项目&#xff0c;融合项目结构便捷前端拿取合约 Abi 我们用react 创建了一个 dapp 项目 并将前后端代码做了个整合 那么 我们就来好好整理一下 我们的前端react的项目结构 我们在 src 目录下创建一个 components 用来存放我们的…

视频怎么压缩?视频太大这样处理变小

在当今时代&#xff0c;视频已经成为了我们日常生活中不可或缺的一部分&#xff0c;然而&#xff0c;视频文件往往非常大&#xff0c;给我们的存储和传输带来了很大的不便&#xff0c;那么&#xff0c;如何有效地压缩视频呢&#xff1f; 一、使用压缩软件 首先我们给大家分享一…

python的搜索引擎系统设计与实现 计算机竞赛

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python的搜索引擎系统设计与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;5分创新点&#xff1a;3分 该项目较为新颖&#xff…

5.覆盖增强技术——PUCCHPUSCH

PUSCH增强方案的标准化工作 1.PUSCH重复传输类型A增强&#xff0c;包括两种增强机制&#xff1a;增加最大重复传输次数&#xff0c;以及基于可用上行时隙的重复传输次数技术方式。 2.基于频域的解决方案&#xff0c;包括时隙间/时隙内跳频的增强 3.支持跨多个时隙的传输块&…