排序—插入排序(Insertion Sort)

目录

前言:

插入排序思路

代码如下:

时间复杂度

空间复杂度

结语:


前言:

本节我们将学习插入排序的核心思想、执行流程与 C++ 代码实现,同时分析代码调试中容易出现的数组越界、插入位置错误等典型问题,理解它的时间、空间复杂度以及适用场景,为后续学习希尔排序打下基础。

排序其他内容:

快速排序:排序-快速排序(Quick sort)(基础版)-CSDN博客

归并排序:排序-归并排序(Merge Sort)-CSDN博客

插入排序思路

插入排序如下面这张图,从左到右,一个牌一个牌的摸,插入到摸到的牌合理的位置上去,这样的流程就是插入排序。

下面动态图是插入排序的演示图,可以观看一下,了解插入的思路流程。

从动态图中可以看出,这个排序的流程是(取元素 → 比较 → 后移 → 插入)。

开头将第一个数当作有序,从第二个开始与之前第一个进行比较,比第一个大则插入到第一个数的后面,比第一个小则第一个数后移成第二个数,第二个数插入到第一个数的前面,成为第一个数,然后不断的进行比较,就会得到一个排序完的数组。

代码如下:

cpp 复制代码
void InsertionSort(int* a, int n)
{
	for (int i = 0; i < n-1; i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end+1] = a[end];
				
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

为什么不可以将改为(aend=tmp)放在if中进行赋值,结果有什么差别吗?

有差别的,

改为的写法是:挪一步,就把 tmp 放回去,end 继续往前,下一轮又会把 tmp 所在位置再次覆盖改写。 有些数组会碰巧排对,换一组数据就直接错乱。
正确逻辑

while 循环只做一件事:把所有大于 tmp 的元素向后挪动 ,只空出正确的插入位置。 当 while 结束,end+1 就是最终空位,循环结束后,再把 tmp 填入这个空位
注意:for循环中的结束条件是i<n-1,而不是n,否则会出现数组越界,如下图:

cpp 复制代码
void InsertionSort(int* a, int n)
{
	for (int i = 0; i < n; i++)
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end+1] = a[end];
				
				end--;
			}
			else
			{
				break;
			}
		}
		a[end +1] = tmp;
	}
}

int main()
{
	int a[3] = {3,2,1};
	InsertionSort(a, 3);

	//ShellSort(a, 10);

	/*MergeSort(a, 10);*/
	/*QuickSortNonR(a, 0,9);*/
	for (auto e : a)
	{
		cout << e << " ";
	}
	return 0;
}

明明只有1,2,3却出现了0这个数,就是因为for循环的结束条件出现了问题。

时间复杂度

最坏(逆序):(O(n^2)),每个元素都要移动全部前面元素

最好(本身已经有序):(O(n)),只遍历不移动,这是插入排序很大优势

平均:(O(n^2))

空间复杂度

空间复杂度:\(O(1)\),原地排序,不需要额外大数组

结语:

谢谢你的观看,希望可以给你提供帮助!!!

相关推荐
不会就选b11 小时前
数据结构之树&&二叉树(二)
数据结构·算法
小刘在重生~13 小时前
Java 集合|Collection、List、ArrayList、LinkedList、泛型、Collections 工具类
java·数据结构·list
我不会起名字32213 小时前
一天一道算法题(29):单调栈
java·数据结构·python·算法·leetcode·golang·单调栈
苦瓜小生14 小时前
【前端】【力扣与手撕】十天带你刷完前端算法与手撕,全是最简单好记的最优解法!day4
前端·数据结构·算法·leetcode·面试
少司府15 小时前
C++进阶:智能指针
开发语言·数据结构·c++·b树·算法·c·智能指针
LuminousCPP16 小时前
数据结构-排序(一):基础排序算法横向对比|冒泡、插入、希尔、堆与双向选择,详解二分 / Knuth 增量
c语言·数据结构·笔记·算法·排序算法
青山木17 小时前
Hot 100 --- 买卖股票的最佳时机
java·数据结构·算法·leetcode·贪心算法
csdn_aspnet17 小时前
C++ 未排序数组中第 k 个最小/最大元素 | 最坏情况下的线性时间
数据结构·c++·算法
aqiu1111111 天前
【LeetCode 902】最大为 N 的数字组合 - 详细题解与数位组合思路
数据结构·算法·leetcode·蓝桥杯·数位dp
2601_962297481 天前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作