插入排序(Insertion-Sort)

1 概述

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。通俗讲就是,好比打斗地主时抓扑克牌一样,每次抓起一张牌就找到其合适的位置放进去。

2 算法流程

  1. 每次循环需要加入一个未排序的元素key,从后往前扫描,如果比key大的数就将其后移位置,给key腾位置,扫描到初始位置或找到不大于key的元素,实际上就是给key找合适的位置放进去
  2. 第1个元素不用找位置,从第2个元素开始按照步骤1找位置,依次进行,直至完成最后1个位置的找位置操作

3 代码/Python

def InsertionSort(nums):
    # 第一个元素不用动,遍历后面所有的元素
    for i in range(1,len(nums)):
        # 第i次循环需要加入1个元素,使得已排序的数列长度为i
        # 记录加入的这个元素的数值
        key = nums[i] 
        # 对前i-1个已排序的数列从后往前扫描,j是扫描位置
        j = i - 1 
        # 由后向前,终止条件是到达初始位置或没有比key更大的数,由于前i个都是已排好序的,所以出现不大于key时,循环就终止了
        while(j>=0 and nums[j]>key):
            # 扫描过程中,如果找到比key更大的数,则位置后移(腾出1个位置给key)
            nums[j+1] = nums[j]            
            j = j - 1 
        # 循环结束后的j是-1或者最先出现的不大于key的元素的位置,因此key排在j+1
        nums[j+1] = key
    return nums

# 算法调用
import random
nums = [random.randint(0,100) for i in range(10)]

print('随机生成10个数字:', nums)
print('排序后输出结果为:', InsertionSort(nums))

4 算法解释

  • 插入排序,原理很好理解,算法实现有个细节就是记录key的值,然后从后往前扫描,将比key大的元素往后挪位置
  • 时间复杂度:采用两层嵌套循环,所以时间复杂度是 O ( n 2 ) O(n^2) O(n2);最好的情况就是数列本身已排好序,每次找位置操作进行一次扫描即可,所以最好情况是 O ( n ) O(n) O(n);最坏情况就是每次扫描都需要遍历一遍已排序数列,找到起始位置,所以最坏情况是 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度:由于开辟的额外空间只需记录每次循环新增的元素key,所以是 O ( 1 ) O(1) O(1)
  • 稳定性:每次扫描遇到不大于key的数就停止,所以相等的元素的相对位置不会发生变化,所以是稳定的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值