直接插入排序详解

直接插入排序

1 基本思想

直接插入排序是一种简单的插入排序法 ,其思想的关键就是将待排序的序列里的数一个个插入已经排序好的序列里面,直到未排序的序列数全部插入为止,从而得到一个新的排序好的序列

生活示例:

我们在打扑克牌将牌按大小顺序依次的排序 的时候,我们抓来一张新的牌便根据我们手上已经排序好的牌依次从后面比较并插入合适位置 ,从而保持手中牌的有序性

2 直接插入排序动态图

我们可以从递归的角度 来看待直接插入算法,你想让整个数组有序,那你就要让该数组前n-1个数有序,并将最后一个数从后面依次遍历 这个大小为n-1的有序数组并插入其中,从而让整个数组有序。

3 直接插入排序代码实现
c 复制代码
void InsertSort(int arr[], int size)
{
	int temp = 0;
	int end = 0;//定义一个排序好的数组最后一个下标
	for (int i = 0; i < size - 1; i++)
	{
		end = i;
		temp = arr[end + 1];
		while (end >= 0)
		{	
			if (arr[end] > temp)
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = temp;
	}
}

直接插入代码详解

第一部分:
c 复制代码
int temp = 0;
int end = 0;//定义一个排序好的数组最后一个下标

temp用来保存待插入有序序列的元素 ,而end用来记录有序的序列的最后元素下标

第二部分

我们从有序序列只有一个元素,通过不断的循环插入,使数组最后有序,而变量i用来记录每一次进入有序序列的最后元素下标。而要插入数据的下标为i+1,所以最后一个元素插入有序数组的最后一个下标为size-2,所以循环条件为i < size - 1

c 复制代码
for (int i = 0; i < size - 1; i++);
第三部分
c 复制代码
while (end >= 0)
		{	
			if (arr[end] > temp)
			{
				arr[end + 1] = arr[end];
				end--;
			}
			else
			{
				break;
			}
		}
		arr[end + 1] = temp;

arr[end] > temp时先将end位置元素移动到后面元素位置arr[end + 1] = arr[end],并将end--从而遍历这个已经有序的数组,将它们依次与temp比较,如果arr[end] >temp不成立时则新加入元素temp应该在end+1的位置,循环的终止条件end>=0即遍历到第一个元素位置,如果跳出这个循环 temp还没有插入数组中,那说明temp最小该插入第一个位置即下标为0的位置,即end+1(end此时为-1)。

4 直接插入排序时间复杂度分析
  • 最好时间复杂度为O(n),即数组一开始就是有序的
  • 最坏时间复杂度 为O(n2)

排序元素越接近有序,直接插入排序算法时间效率越高。

相关推荐
knight_9___1 小时前
大模型project面试7
人工智能·python·算法·面试·大模型·agent
NashSKY2 小时前
EM 算法完整推导与本质剖析
算法·机器学习·概率论
foundbug9992 小时前
MATLAB实现:基于图像对比度和波段相关性的高光谱波段选择算法
开发语言·算法·matlab
嘿嘿嘿x33 小时前
Linux-实践
linux·运维·算法
Godspeed Zhao3 小时前
从零开始学AI14——最大似然估计与对数损失函数
算法·逻辑回归·最大似然
流年如夢3 小时前
排序算法详解
数据结构·算法·排序算法
会编程的土豆3 小时前
Go 语言中的 `new` 关键字(创建指针)
java·算法·golang
南宫萧幕3 小时前
HEV能量管理建模实战:从零搭建 Simulink 物理环境到 Python(DQN) 强化学习联合仿真调通
开发语言·python·算法·matlab·汽车·控制
x_yeyue3 小时前
2026第十七届蓝桥杯c++B组省赛题解
笔记·算法·蓝桥杯·acm·题解