排序算法专题-插入排序

  插入排序是一种在原理上十分简单的算法,就跟打扑克牌一样,握在手里的是有序数列,每获得一张新牌,就插入有序数列中合适的位置。

  • 算法步骤:
  • 1:将数组第一个元素是为有序数列,第二个元素即之后的所有元素为未排序数列
  • 2:从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
  • 举个栗子
    原数组:3 38 5 44 15 36
    第一轮:3 38 5 44 15 36
    第二轮:3 5 38 44 15 36
    第三轮:3 5 38 44 15 36
    …以此类推

  • 代码如下:
def insertSort(nums):
    n = len(nums)
    for i in range(1, n):
        insert_index = i-1
        temp = nums[i]
        while insert_index>=0 and nums[insert_index] > temp:
            nums[insert_index+1] = nums[insert_index]
            insert_index -= 1
        nums[insert_index+1] = temp
        
nums = [3,38, 5, 44, 15, 36]
insertSort(nums)
print(nums)
  • 算法解析:插入排序同样是每一次迭代确定一个元素的位置,一共需要n-1次迭代,然而插入操作的迭代次数无法把我,最好是0,最坏是k(k为迭代次数),因此该算法对于有序数组的时间复杂度为n-1,即O(n),如果将递增数组排序为递减数组,此时是最坏时间复杂度,为(1+2+3+n-1)=(n-1)*n/2,即O(n2),由于该算法是对原数组进行操作,因此空间复杂度为O(1)。
  • 由于该算法对待插入的元素与有序序列中的某个元素相等时,将待插入元素插入到相等元素的后面,因此该算法不会改变相等元素的相对次数,是稳定算法。
  • 该算法有一种优化版本,由于该算法是基于一种寻找插入位置的方式进行,因此在这个过程可以使用二分查找,因此该算法的优化算法叫折半插入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lemon_tttea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值