算法 -插入排序

博客主页:【夜泉_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语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

相关推荐
Uitwaaien54几秒前
51 单片机矩阵键盘密码锁:原理、实现与应用
c++·单片机·嵌入式硬件·51单片机·课程设计
墨楠。28 分钟前
数据结构学习记录-树和二叉树
数据结构·学习·算法
小唐C++34 分钟前
C++小病毒-1.0勒索
开发语言·c++·vscode·python·算法·c#·编辑器
醇醛酸醚酮酯1 小时前
Leetcode热题——移动零
算法·leetcode·职场和发展
沉默的煎蛋1 小时前
MyBatis 注解开发详解
java·数据库·mysql·算法·mybatis
Aqua Cheng.1 小时前
MarsCode青训营打卡Day10(2025年1月23日)|稀土掘金-147.寻找独一无二的糖葫芦串、119.游戏队友搜索
java·数据结构·算法
夏末秋也凉1 小时前
力扣-数组-704 二分查找
算法·leetcode
玛丽亚后1 小时前
动态规划(路径问题)
算法·动态规划
qy发大财1 小时前
平衡二叉树(力扣110)
数据结构·算法·leetcode·职场和发展
我们的五年1 小时前
【C语言学习】:C语言补充:转义字符,<<,>>操作符,IDE
c语言·开发语言·后端·学习