插入排序原理及C++源码实现


一、原理

将一个数据插入到已排好序的有序表中,从而形成一个新的、记录数增1的有序表。


二、思路

直接插入排序是将无序序列中的数据插入到有序的序列中,在遍历无序序列时,首先拿无序序列中的首元素去与有序序列中的每一个元素比较并插入到合适的位置,一直到无序序列中的所有元素插完为止。

实例:
对数据[1, 4, 2, 6, 7, 3, 5, 10, 9]进行插入排序。

以数组序列首元素1为有序序列,得到有序序列[1],此时数组为[1, 4, 2, 6, 7, 3, 5, 10, 9]。

  1. 第一次排序:取出数组第二个元素4,插入有序序列,得到新的有序序列[1,4], 此时序列为[1, 4, 2, 6, 7, 3, 5, 10, 9]。

  2. 第二次排序:取出数组第三个元素2,插入有序序列,得到新的有序序列[1,2,4],此时序列为[1, 2, 4, 6, 7, 3, 5, 10, 9]。

  3. 第三次排序:取出数组第四个元素6,插入到有序序列,得到新的有序序列[1,2,4,6],此时序列为[1, 2, 4, 6, 7, 3, 5, 10, 9]。

  4. 第四次排序:取出数组第五个元素7,插入到有序序列,得到新的有序序列[1,2,4,6,7],此时序列为[1, 2, 4, 6, 7, 3, 5, 10, 9]。

  5. 第五次排序:取出数组第六个原色3,插入到有序序列,得到新的有序序列[1,2,3,4,6,7],此时序列为[1, 2, 3, 4, 6, 7, 5, 10, 9]。

  6. 第六次排序:取出数组第七个元素5,插入到有序序列,得到新的有序序列[1,2,3,4,5,6,7],此时序列为[1, 2, 3, 4, 5, 6, 7, 10, 9]。

  7. 第七次排序:取出数组第八个元素10,插入到有序序列,得到新的有序序列[1,2,3,4,5,6,7,10],此时序列为[1, 2, 3, 4, 5, 6, 7, 10, 9]。

  8. 第八次排序:取出数组第九个元素9,插入到有序序列,得到新的有序序列[1,2,3,4,5,6,7,9,10],此时序列为[1, 2, 3, 4, 5, 6, 7, 9,10]


三、插入排序特点

  • 时间复杂度
    当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以,这是一共需要比较N-1次,时间复杂度为O(n)。
    最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+4+…+N-1,此时插入排序最坏情况下的时间复杂度为O(n2)。

  • 空间复杂度
    插入排序的空间复杂度为常数阶O(1)


四、C++源码实现

实现过程使用双层循环,外循环除了一个元素之外的所有元素,内循环对当前元素前面有序表进行待插入位置进行查找,并进行移动。


void StraightSort(int arr[], int len)
{
	int i,j,temp;
	for (i = 1; i < len; i++)
	{
		//数组往右逐个获取数据作为待插入到有序数组的值
		temp = arr[i];   
		
		//比较待插入值和有序数组的值,找到插入数值在有序数组中的位置
		for (j=i-1; 0 <=j && temp < arr[j]; j--) 
		{
			arr[j+1]=arr[j];
		}
		arr[j+1]=temp;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值