【数据结构】常见的排序算法 -- 插入排序

🫧个人主页: 小年糕是糕手

💫个人专栏:《数据结构(初阶)》** 《C/C++刷题集》 《C语言》**

🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!



目录

一、直接插入排序

1.1、算法思想

1.2、代码实现

二、希尔排序

2.1、算法思想

2.2、代码实现

2.3、时间复杂度计算


一、直接插入排序

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

举一个生活中的例子:我们玩的扑克牌游戏,我们整理牌的时候采用的就是一个插入排序。

1.1、算法思想

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

1.2、代码实现

cpp 复制代码
void InsertSort(int* arr, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		int end = i;
		int tmp = arr[end + 1];
		while (end > 0)
		{
			if (arr[end] > tmp)
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = tmp;
	}
}

直接插入排序的特性总结

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

注意:当给定的数组接近有序时我们的时间复杂度会接近于O(N)但是不会真正达到

二、希尔排序

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数(通常是gap = n / 3 + 1),把待排序文件所有记录分成各组,所有的距离相等的记录分在同一组内,并对每一组内的记录进行排序,然后gap = gap / 3 + 1得到下一个整数,再将数组分成各组,进行插入排序,当gap = 1时,就相当于直接插入排序。

它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的。

2.1、算法思想

  1. 确定初始步长选择一个小于数组长度的初始步长(如初始步长 = 数组长度 ÷ 2,后续逐步减半,直到步长为 1)。步长的选择直接影响排序效率,常见的有 "折半步长""Hibbard 步长" 等。
  2. 分组插入排序按当前步长将数组分为多个子组,每个子组由 "间隔为步长的元素" 组成(例如步长为 5 时,第 1、6、11... 个元素为一组,第 2、7、12... 个元素为另一组)。对每个子组分别执行插入排序,让子组内部变得有序。
  3. 逐步缩小步长并重复每次将步长缩小(如折半为原来的 1/2),重复 "分组插入排序" 操作。当步长缩小到 1 时,整个数组变为一个子组,执行最后一次插入排序,此时数组已接近有序,插入排序的效率会极高

2.2、代码实现

cpp 复制代码
void ShellSort(int* arr, int n)
{
	int gap = n;
	while (gap > 1)
	{
		//推荐写法:除3 
		gap = gap / 3 + 1;

		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = arr[end + gap];
			while (end >= 0)
			{
				if (arr[end] > tmp)
				{
					arr[end + gap] = arr[end];
					end = end - gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = tmp;
		}
	}
}

希尔排序的特性总结

  1. 希尔排序是对直接插入排序的优化。
  2. 当 gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。

2.3、时间复杂度计算

希尔排序的时间复杂度估算:

外层循环外层循环的时间复杂度可以直接给出为:O(log2 ​n) 或者 O(log3 ​n),即O(log n)

内层循环

希尔排序时间复杂度不好计算,因为 gap 的取值很多,导致很难去计算,因此很多书中给出的希尔排序的时间复杂度都不固定。《数据结构(C语言版)》--- 严蔚敏书中给出的时间复杂度为:

相关推荐
斯维赤16 分钟前
AI Agent学习之路 | Prompt Engineering(提示词工程)的三板斧核心技巧
人工智能·学习·prompt
xiangyun6124 分钟前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun6136 分钟前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
OKkankan2 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
蓝速科技2 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
白远山2 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
302wanger2 小时前
推荐下我的两个AI信息源
算法
索尔~古德曼2 小时前
CF——错题的集合
算法
xxwxx__2 小时前
C++ AVL 树深度剖析:平衡二叉搜索树原理、源码与面试考点
数据结构·c++
2301_802651082 小时前
imx6ull裸机开发:UART
学习