算法 -插入排序

博客主页:【夜泉_ly

本文专栏:【算法

欢迎点赞👍收藏⭐关注❤️

文章目录

💡插入排序

插入排序可以分为直接插入排序和希尔排序。


1. ➡️ 直接插入排序

🖼️示意图

插入排序 − 示意图 插入排序 -示意图 插入排序−示意图

📖简介

直接插入排序常用于处理数据量较小的情况,其思想和打牌类似,都是将新元素插入到有序数组。

时间复杂度为 O ( N 2 ) O(N^2) O(N2) 。如果数据量过大,直接插入排序会因频繁的挪动数据降低效率。

💡实现思路

  • 定义一个指针 end ,初始为0,表示已排序数组的结束位置。
  • 取牌,用一个临时变量 tmp 存储 end + 1处的值,表示待插入的值。
  • 挪牌,将已排序的数组中小于 tmp 的向后挪动一个位置。(这里 end + 1 的值已被保存,可以直接覆盖)
    • 定义 cur 指向 end
    • 如果 cur 处的值大于 tmp,将该值向后挪动一位,然后cur--
    • 结束条件为 cur <= -1 或者 cur 处的值小于等于 tmp
  • 插入,将 tmp 插入 cur + 1处,然后 end++
  • 结束条件为 end >= size - 1 ,即所有元素都已排序。

💻代码实现

cpp 复制代码
void InsertSort(int* arr, int size)
{
	for (int end = 0; end != size - 1; end++)
	{
		int tmp = arr[end + 1];
		int cur = end;
		while (cur > -1 && arr[cur] > tmp)
		{
			arr[cur + 1] = arr[cur];
			cur--;
		}
		arr[cur + 1] = tmp;
	}
}

📝具体示例

待排序数组:

首先,定义一个指针 end ,指向 0 处,表示已排序手牌:

取牌,用一个临时变量 tmp 存储 end + 1处的值,表示待插入的手牌:

挪牌:(当cur == -1,停止挪牌)

插入:(将tmp插入cur + 1处)

第二轮取牌加挪牌:(当cur处的值小于 tmp,也停止挪牌)

插入:

之后,重复上述过程即可。


2. ⬆️ 希尔排序

🖼️示意图

希尔排序 − 示意图 希尔排序 -示意图 希尔排序−示意图

📖简介

希尔排序是插入排序的升级版,本质是通过分组进行插入排序,可以将较大的数据尽快的挪到数组后面,从而减少挪动数据的次数,提高了效率。

时间复杂度大约为 O(N ^ 1.3),具体时间复杂度会随分组的标准而变。

💡实现思路

  • 定义 gap ,初始值为 size/3 + 1,间隔为 gap 的数被分到一组。
  • 对每组进行插入排序
    • 定义一个指针 end ,初始为0,表示已排序数组的结束位置。
    • 取牌,用一个临时变量 tmp 存储 end + gap处的值,表示待插入的值。
    • 挪牌,将已排序的数组中小于 tmp 的向后挪动一个位置。(这里 end + gap 的值已被保存,可以直接覆盖)
      • 定义 cur 指向 end
      • 如果 cur 处的值大于 tmp,将该值向后挪动一位,然后cur -= gap
      • 结束条件为 cur <= -1 或者 cur 处的值小于等于 tmp
    • 插入,将 tmp 插入 cur + gap处,然后 end++
    • 结束条件为 end >= size - gap ,即所有元素都已排序。
  • gap = gap/3 + 1
  • gap == 1 为最后一次排序,此时变为直接插入排序。(经过了预处理,此时的直接插入排序效率大大提高)

💻代码实现

cpp 复制代码
void ShellSort(int* arr, int size)
{
	int gap = size;
	while (gap != 1)
	{
		gap = gap / 3 + 1;
		int end = 0;
		while (end < size - gap)
		{
			int tmp = arr[end + gap];
			int cur = end;
			while (cur > -1 && arr[cur] > tmp)
			{
				arr[cur + gap] = arr[cur];
				cur -= gap;
			}
			arr[cur + gap] = tmp;
			end++;
		}
	}
}

希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!

本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

相关推荐
跳跳糖炒酸奶7 分钟前
第四章、Isaacsim在GUI中构建机器人(2):组装一个简单的机器人
人工智能·python·算法·ubuntu·机器人
绵绵细雨中的乡音22 分钟前
动态规划-第六篇
算法·动态规划
程序员黄同学32 分钟前
动态规划,如何应用动态规划解决实际问题?
算法·动态规划
march_birds1 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
小麦嵌入式1 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
斯汤雷1 小时前
Matlab绘图案例,设置图片大小,坐标轴比例为黄金比
数据库·人工智能·算法·matlab·信息可视化
云 无 心 以 出 岫2 小时前
贪心算法QwQ
数据结构·c++·算法·贪心算法
俏布斯2 小时前
算法日常记录
java·算法·leetcode
独好紫罗兰2 小时前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法
jelasin2 小时前
LibCoroutine开发手记:细粒度C语言协程库
c语言