zoukankan      html  css  js  c++  java
  • [排序N大件之]插入排序

    整理过扑克牌吗?这个排序和你整理扑克牌完全一样!

    我们总是挑选一张牌作为基准,然后决定剩下的牌该插到对于这张牌来说哪个合适的位置:

    从第二张开始,如果牌比他小,那么第二张牌就插到他的前面,如果比他大,那就先不变

    从第三张开始,一次与前面两张比较,如果都比第三张牌大,那之前两张牌总是要往后捣腾位置,然后把这张牌插到空出来的那个位置上。

    插入排序的外层循环:for i in range(1, n)

    表示要一共要整理的元素,从第二个元素开始,因为我们总是取第一个数作为参照

    保存现场

    当前整理到的数,我们要把这个数所有的信息保存起来,下标和值,都要作为内层循环的参照

    • 下标决定了前面已经排好序的元素一直往后捣腾,知道找到一个小于这个元素的值停止
    • 在他之前的每个元素都要进行比较,表示在这个数之前的元素什么时候要往后捣腾

    最后捣腾完了(内层循环结束),把这个抽出来的元素插入到捣腾后空出来的位置

    def insertionSort(nums):
        n = len(nums)
        for i in range(1,n):
            cur = nums[i]
            position = i
            while position > 0 and nums[position - 1] > cur:
                nums[position] = nums[position - 1]
                position = position - 1
    
            nums[position] = cur
    
        return nums
    
    
    if __name__ == "__main__":
        numbers = [3, 7, 5, 4, 8, 9, 6, 2, 1]
        print(insertionSort(numbers))

    时间复杂度:O(n2)

    插入排序也有一个最好的情况:当所有的元素已经从小到大排好序之后,只需要完成一次遍历整个列表就可以了,并不需要移动元素的位置

    空间复杂度:O(1)

  • 相关阅读:
    淘宝镜像安装方法
    vue项目 title处的小图标
    vue生成环境 访问路径配置
    element ui icon不展示
    vue 使用element-ui实现table表单列展示与隐藏
    通过id获取元素控制滚动位置回到顶部
    复杂传值
    vue 中el-card点击事件失效解决
    滚动条隐藏 兼容
    【javascript/PHP】当一个JavaScripter初次进入PHP的世界,他将看到这样的风景
  • 原文地址:https://www.cnblogs.com/canaan233/p/13719325.html
Copyright © 2011-2022 走看看