直接插入排序详解

直接插入排序

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)

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

相关推荐
Swift社区8 小时前
LeetCode 465 最优账单平衡
算法·leetcode·职场和发展
聆风吟º8 小时前
【数据结构手札】空间复杂度详解:概念 | 习题
java·数据结构·算法
weixin_445054729 小时前
力扣热题51
c++·python·算法·leetcode
地平线开发者9 小时前
linux 常见稳定性问题分析方法
算法·自动驾驶
s砚山s9 小时前
代码随想录刷题——二叉树篇(九)
算法
地平线开发者9 小时前
大模型常见量化方法简介
算法·自动驾驶
smj2302_7968265212 小时前
解决leetcode第3801题合并有序列表的最小成本
数据结构·python·算法·leetcode
栗少12 小时前
英语自学手册:系统化进阶指南基于《英语自学手册》的方法论与行动路径
人工智能·算法
Xの哲學13 小时前
深入解析 Linux systemd: 现代初始化系统的设计与实现
linux·服务器·网络·算法·边缘计算
sinat_2554878113 小时前
InputStream/OutputStream小讲堂
java·数据结构·算法