排序算法-插入排序

插入排序

前置学习

了解排序的基本概念
点击传送门

原理

直接插入排序(Straight Insertion Sort) 基本操作是:将一个记录插入到已经排好序的有序数据中,从而得到一个新的、记录数增加1的有序表。

实现

把待排序序列视为两部分:

  1. 一部分为有序序列,通常在排序开始之时将序列中的第一个数据视为一个有序序列;
  2. 另一部分为待排序序列,有序序列之后的数据视为待排序序列。
  3. 在排序开始之时,从序列头部到尾部逐个选取数据,与有序序列中的数据,按照从尾部到头部的顺序逐个比较,直到找到合适的位置,将数据插入其中。

代码

	//定义数组
	int arr[10] = { 9,1,5,6,10,8,3,7,2,4 };
	//数组元素个数
	int len = sizeof(arr) / sizeof(arr[0]);
	
	for (int i = 1; i < len; i++)
	{
		//将无序数据插入到有序数据中
		int temp = arr[i];//设置哨兵
		if (temp < arr[i - 1])
		{
			//依次移动数据到指定位置
			for (int j = i - 1; j >= 0 && temp < arr[j]; j--)
			{
				//移动数据
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
	}

复杂度分析

时间复杂度:

平均时间复杂度:O(n²)

最好时间复杂度:O(n)

最坏时间复杂度:O(n²)

如果排序的数据是随机的,根据概率相同原则,平均比较和移动的次数应为n²/4次,得出直接插入排序的时间复杂度为O(n²)。在同样的时间复杂度中直接插入排序要优于选择排序和冒泡排序。

空间复杂度:

O(1),只需要一个额外空间用于交换。

稳定性:

稳定排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值