欢迎光临散文网 会员登陆 & 注册

十大排序(C++)-- 插入排序(InsertSort)

2023-06-05 09:13 作者:XPenguin鹅  | 我要投稿

        前两种算法原理和实现都相对简单,而到了插入排序开始,就会有一点小小的绕。(我当初也晕了(¦3」∠))插入排序的原理不难,每次选择一个数插入到前面他应该在的位置上。原理很简单hhh但是实现有点小绕。我们同样的一组测试用例:[5,3,8,6,9,2,1,4,7],利用Excel表格能更好的看到效果。

初始位置

我们举个栗子,在第一遍遍历时的设置初始下标i=1,j=i-1,nums[i]此时值为3,j=0,那么此时nums[j]的值比nums[i]大,因此,nums[i]应该插入到nums[j]的前面!说明有序时nums[i]的位置应该在更前面,所以我们先把nums[i]记录下来,把j往后面挪,令nums[j+1]=nums[j],而j继续向前,直到遍历到开头或者遇到nums[i]比nums[j]大的时候,这时的位置就是nums[i]该插入的位置了。

用一个temp记录nums[i],同时nums[j+1]=nums[j]给nums[i]腾位置
在j遇到nums[i]>nums[j]时或j<0时结束遍历,nums[j+1]=temp

我们来看一下实现的代码:

打印一下每遍运行的结果看一下。

插入排序运行结果

由每次的循环我们可以看到,每一次遍历都会多出一个数插入到前面他应到的位置上。

时间复杂度:O(n^2),空间复杂度:O(1)

优点:在最好的情况下时间复杂度为O(n),与冒泡排序一样。但是在处理大量数据时,还记不记得我们是怎么处理冒泡排序中的值的?没错,交换!而一次交换需要耗费3条语句,插入排序只需要一次赋值即可。因此在同样的情况下,插入排序的处理时间会优于冒泡排序。
缺点:同样的,在最差的条件下(比如我们要求正序但用例是完全倒序),时间复杂度为O(n^2)。

十大排序(C++)-- 插入排序(InsertSort)的评论 (共 条)

分享到微博请遵守国家法律