算法 -插入排序

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

相关推荐
DreamByte8 分钟前
C++菜鸟教程 - 从入门到精通 第五节
开发语言·c++·算法
南玖yy15 分钟前
数据结构C语言练习(两个队列实现栈)
c语言·数据结构·算法
长流小哥21 分钟前
可视化开发:用Qt实现Excel级动态柱状图
开发语言·c++·qt·ui
明朝百晓生31 分钟前
【强化学习】【1】【PyTorch】【强化学习简介优化框架】
算法
loser~曹37 分钟前
基于快速排序解决 leetcode hot215 查找数组中第k大的数字
数据结构·算法·leetcode
Dream it possible!42 分钟前
LeetCode 热题 100_打家劫舍(83_198_中等_C++)(动态规划)
c++·算法·leetcode·动态规划
zhouziyi07011 小时前
【蓝桥杯14天冲刺课题单】Day 8
c++·算法·蓝桥杯
SylviaW081 小时前
python-leetcode 62.搜索插入位置
数据结构·算法·leetcode
北极象1 小时前
用C实现一个最简单的正则表达式引擎
c语言·正则表达式·php
愚润求学1 小时前
【C++】vector常用方法总结
开发语言·c++·vector