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

news2025/1/22 12:45:10

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

目录

一、直接插入排序

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;
			else
				high=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;
			else
				high=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.coloradmin.cn/o/1102244.html

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

相关文章

vue项目获得开源代码之后跳过登录界面

readme运行 进入到账号和密码 找到main.js 比如说&#xff0c;以上这段代码 剩下next&#xff08;&#xff09;就成功进入了

SAP MM学习笔记37 - 请求书照合中的 追加请求/追加Credit 等概念/ 请求书的取消

有关请求书照合&#xff0c;之前学习了一部分&#xff0c;现在再来学其中的一些概念。 其实这些概念也许并不常用&#xff0c;但是你又不能不知道&#xff0c;因为客户会问。 有关请求书&#xff0c;贴一些以前学习的文章&#xff0c;以方便阅读。 SAP MM学习笔记33 - 请求书…

雷达人体感应器成品方案,智能化空间联动交互,人体存在触发应用

随着科技的快速发展&#xff0c;智能化已经成为我们生活中不可或缺的一部分。在酒店、会议室和办公室等场合&#xff0c;智能化更是显得尤为重要。 智能雷达感应器成品设备能够实时监测人体的静止存在&#xff0c;精准地探测人体存在&#xff0c;进而触发联动设备&#xff0c;…

【C++】BMI身体质量指数计算工具

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍BMI身体质量指数计算工具。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷…

信创办公–基于WPS的Word最佳实践系列 (图文环绕方式)

信创办公–基于WPS的Word最佳实践系列 &#xff08;图文环绕方式&#xff09; 目录 应用背景操作步骤1、 打开布局选项中图文环绕方式的方法2、 图文环绕三大类型 应用背景 在Word中&#xff0c;对文字和图片进行排版时&#xff0c;采用各种不同的图片与文字组合效果能够使页面…

Python基础教程:装饰器的详细教程

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、什么是装饰器 目的&#xff1a;给func()方法&#xff0c;增加一个功能&#xff0c;在fun()执行期间&#xff0c;同时把fun()执行速率机算出来 import time def func():print(嘻嘻哈哈)start_time time.time() ti…

Windows版IntelliJ插件SmartInput使用入门

插件设置 CtrlAlts 打开Setting&#xff0c;可以找到SmartInput插件设置页面&#xff0c;也可以通过“右键 -> SmartInput -> 插件设置”快速进入。右键选项打开使用统计可以看到插件为您有效切换输入法的次数。如果您遇到了BUG&#xff0c;右键选项反馈错误日志并复制U…

深入理解强化学习——智能体的类型:有模型强化学习智能体与免模型强化学习智能体

分类目录&#xff1a;《深入理解强化学习》总目录 根据智能体学习的事物不同&#xff0c;我们可以把智能体进行归类。基于价值的智能体&#xff08;Value-based agent&#xff09;显式地学习价值函数&#xff0c;隐式地学习它的策略。策略是其从学到的价值函数里面推算出来的。…

AlphaFold-multimer 复合物结构预测

AlphaFold-multimer 复合物结构预测 AlphaFold-multimer是DeepMind开发的AlphaFold项目的一个扩展&#xff0c;旨在预测蛋白质多聚体的三维结构。蛋白质多聚体是由多个蛋白质亚单位相互组装而成的结构&#xff0c;如酶、膜蛋白复合物和病毒颗粒。理解多聚体的结构对于揭示蛋白…

提高编程效率-Vscode实用指南

您是否知道全球73%的开发人员依赖同一个代码编辑器&#xff1f; 是的&#xff0c;2023 年 Stack Overflow 开发者调查结果已出炉&#xff0c;Visual Studio Code 迄今为止再次排名第一最常用的开发环境。 “Visual Studio Code 仍然是所有开发人员的首选 IDE&#xff0c;与专业…

数据库第六章作业

发表本文章意为记录与分享 第6章作业.xls 题量: 25 满分: 100 一. 单选题&#xff08;共25题&#xff09; 1. (单选题)关系模式中&#xff0c;满足2NF的模式&#xff0c;&#xff08; &#xff09;。 A. 可能是1NFB. 必定是3NFC. 必定是1NFD. 以上都不正确 我的答案: C :…

MySQL的多表操作-外键约束

文章目录 外键约束介绍特点添加外键约束数据插入 删除外键约束 外键约束 介绍 MySQL 外键约束&#xff08;FOREIGN KEY&#xff09;是表的一个特殊字段&#xff0c;经常与主键约束一起使用。对于两个具有关联关系的表而言&#xff0c;相关联字段中主键所在的表就是主表&#…

执行事务合伙人和法人区别是什么

1. 定义不同&#xff1a; 执行事务合伙人指负责经营和管理合伙企业的人&#xff0c;对外代表合伙企业进行业务活动&#xff0c;对内负责合伙企业的日常管理。 法人则是企业的法定代表人&#xff0c;代表企业参与民事活动&#xff0c;是企业的行政领导&#xff0c;对企业经济活动…

WebGL 世界坐标系和本地坐标系

目录 前言 ​编辑本地坐标系 世界坐标系 变换与坐标系 前言 在WebGL 从0到1绘制一个立方体_山楂树の的博客-CSDN博客中&#xff0c;我们创建并显示了第一个三维物体&#xff08;一个立方体&#xff09;&#xff0c;示例程序开始变得像一个“真正”的三维程序了。我们亲…

C++数位算法:数字1的个数

题目 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1&#xff1a; 输入&#xff1a;n 13 输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0 提示&#xff1a; 0 < n < 109 2023年1月版 class S…

2000-2023年省市县人工智能企业数量数据

2000-2023年省市县人工智能企业数量数据 1、时间&#xff1a;2000-2023年7月 2、指标&#xff1a;所属年度、所属省份、所属城市、所属区县、人工智能企业数量&#xff08;省人工智能企业数量、地级市人工智能企业数量、区县人工智能企业数量&#xff09; 3、来源&#xff1…

python接口自动化测试(六)-unittest-单个用例管理

前面五节主要介绍了环境搭建和requests库的使用&#xff0c;可以使用这些进行接口请求的发送。但是如何管理接口案例&#xff1f;返回结果如何自动校验&#xff1f;这些内容光靠上面五节是不行的&#xff0c;因此从本节开始我们引入python单元测试框架 unittest&#xff0c;用它…

用Java包com.sun.net.httpserver下面的类实现一个简单的http服务器demo

java的com.sun.net.httpserver包下的类提供了一个高层级的http服务器API&#xff0c;可以用来构建内嵌的http服务器。支持http和https。这些API提供了一个RFC 2616 (HTTP 1.1)和RFC 2818 (HTTP over TLS)的部分实现。 https://docs.oracle.com/en/java/javase/19/docs/api/jdk.…

C++对象模型(12)-- 构造函数语义学:构造函数

1、默认构造函数生成规则 编译器不一定会为类生成默认构造函数&#xff0c;但在下列情况下&#xff0c;编译器会生成默认构造函数。 &#xff08;1&#xff09;该类没有任何构造函数&#xff0c;但包含一个类类型的成员变量&#xff0c;且成员变量所属的类有默认构造函数。 …

基于antd实现动态修改节点的Tree组件

前言 之前遇到一个需求&#xff0c;可对于任意节点添加或删除子节点。首先技术栈是基于reactant design&#xff0c;ant提供了Tree组件&#xff0c;但都是根据固定的数据渲染出树结构&#xff0c;如果需要新增或删除节点&#xff0c;官网并未提供。 实现过程 新增节点 首先…