直接插入排序详解

直接插入排序

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)

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

相关推荐
ZhengEnCi3 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
秋天的怀念_David4 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Pniubi4 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6184 小时前
大模型落地三重优化实战
人工智能·算法·机器学习
云和数据.ChenGuang4 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
2601_970703836 小时前
工业除湿机租赁:把一份租金合同拆开看
大数据·数据结构·算法·数据库架构·推荐算法
心中有你02146 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
ZhengEnCi7 小时前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
Flynn Liang7 小时前
RAG 答非所问/幻觉怎么破?Spring AI QuestionAnswerAdvisor 召回优化实战(TopK/重排/混合检索)
人工智能·算法·spring·rag·幻觉·springai
liminla!8 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法