插入排序算法

def insertion_sort_v2(nums):
    n = len(nums)
    # 从第二个数开始往后遍历
    for i in range(1, n, 1):
        # 加速方法: 既然i-1之前的所有元素都是有序的,如果i比i-1的大或相等,则不用多次一举从前到后了
        # 只有i比i-1对应的元素小,才需要与前面的比较
        if nums[i] >= nums[i-1]:
            continue

        temp = nums[i]  # 将当前元素缓存
        j = i
        # 逆序将j-1及其之前所有元素与i对应的temp比较,如果比temp大则右移一位,
        # 直到某个j-1上的数不大于temp
        # 或者j=0了,此时原来j=0的元素一定是因为大于temp而右移到了1这个位置,0上空缺
        while (j > 0) and (nums[j-1] > temp):
            nums[j] = nums[j-1]
            j -= 1
        # 如果j >0, 既然此时j-1上的元素不大于temp,就把temp放在j上
        # 如果j+0,此时0上空缺,就把temp放在0=j上
        nums[j] = temp
        # 此时i及i位置之前的所有数都是从小到大排列的了

# 首先该算法需要从第二个元素开始遍历所有元素,共n-1次
# 最好的情况下,数组本身是有序的,所以每次只需要与之前的一个元素比较一次,即1+1.。。。=n-1次
# 最坏的情况, 数组本身逆序,因此遍历到第i个元素的时候,需要与之前的元素比较i-1次,因此1+2+3+4....=(n)(n-1)/2次
# 平均来看,需要(n-1 + (n)(n-1) /2) / 2 约等于n2/ 4, 因此时间复杂度O(n2)
# 希尔排序能有所改进
a = [4, -1, 2, -1, 3]
insertion_sort_v2(a)
print(a)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值