算法 -插入排序

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

相关推荐
2401_858286114 分钟前
L13.【LeetCode笔记】合并两个有序数组
c语言·开发语言·数据结构·笔记·算法·leetcode
正儿八经的数字经29 分钟前
算力100问☞第17问:什么是NPU?
人工智能·算法
白落微尘30 分钟前
string(11.23)
c++·算法
离歌漠35 分钟前
C#调用C++ DLL方法之C++/CLI(托管C++)
c++·c#·clr
午言若40 分钟前
C++ 中的模板特化和偏特化
c++
盼海2 小时前
排序算法(六)--堆排序
java·算法·排序算法
叫我:松哥2 小时前
基于python flask的网页五子棋实现,包括多种语言,可以悔棋、重新开始
开发语言·python·算法·游戏·flask
陈序缘2 小时前
Rust 力扣 - 198. 打家劫舍
开发语言·后端·算法·leetcode·rust
凭君语未可2 小时前
豆包MarsCode算法题:三数之和问题
java·算法
秋夜白2 小时前
【排序算法 python实现】
开发语言·python·排序算法