首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【数据结构】常见的排序算法 -- 插入排序

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

作者头像
小年糕是糕手
发布2026-01-14 17:22:03
发布2026-01-14 17:22:03
1170
举报
文章被收录于专栏:C++学习C++学习

一、直接插入排序

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

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

1.1、算法思想

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

1.2、代码实现
代码语言:javascript
复制
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、代码实现
代码语言:javascript
复制
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语言版)》--- 严蔚敏书中给出的时间复杂度为:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、直接插入排序
    • 1.1、算法思想
    • 1.2、代码实现
    • 二、希尔排序
      • 2.1、算法思想
      • 2.2、代码实现
      • 2.3、时间复杂度计算
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档