直接插入排序详解

直接插入排序

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)

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

相关推荐
一只侯子5 小时前
Tuning——CC调试(适用高通)
开发语言·图像处理·笔记·学习·算法
csdn_aspnet5 小时前
直圆锥(Right Circular Cone)
算法·圆锥
JJJJ_iii5 小时前
【机器学习07】 激活函数精讲、Softmax多分类与优化器进阶
人工智能·笔记·python·算法·机器学习·分类·线性回归
天若有情6735 小时前
TFword:从字符到片段,解析一个“小而精”的字符串处理工具的设计智慧
java·jvm·算法
DuHz6 小时前
频率分集阵列雷达——论文阅读
论文阅读·算法·汽车·信息与通信·毫米波雷达
机器学习之心6 小时前
198种组合算法+优化RF随机森林+SHAP分析+新数据预测!机器学习可解释分析,强烈安利,粉丝必备!
算法·随机森林·机器学习·shap分析·198种组合算法
jikiecui6 小时前
信奥崔老师:实数型: float、double
c++·算法
知花实央l7 小时前
【数字逻辑】数字逻辑实验实战:74HC151实现逻辑函数+74HC138搭全加器(附接线步骤+避坑指南)
算法·容器·测试用例·逻辑回归