直接插入排序详解

直接插入排序

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)

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

相关推荐
极光通讯16 分钟前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
淡海水34 分钟前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
ClickHouseDB37 分钟前
ClickHouse 大规模 OpenTelemetry 数据接入架构的可靠性演进
算法
Shaoshing44 分钟前
BHU 润石工作室 251019自建赛题解
算法
玩AI的奶茶1 小时前
24GB 显存能跑多大的模型?参数量、精度与显存占用对照表
人工智能·python·算法·ai·aigc·gpu算力·算力租赁
java_nnnn1 小时前
LeetCode刷题双指针(有效三角形的个数+三数之和)Java
算法·leetcode·职场和发展
人工智能培训1 小时前
智能博弈背景下中国AI国防建设的战略价值
大数据·人工智能·算法·重构·生活
flinn_small1 小时前
三分算法:原理、实现与实战应用
数据结构·算法·三分
思茂信息2 小时前
CST软件UV Slice切片后可直接删除指定一侧实体
算法·uv·emc·emi·cst·仿真软件
INGNIGHT2 小时前
944 · 最大子矩阵(前缀和)
数据结构·c++·算法