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)

  • 相关阅读:
    机器学习的模型泛化
    机器学习中的过拟合和欠拟合及交叉验证
    sklearn中的多项式回归算法
    PCA算法提取人脸识别特征脸(降噪)
    sklearn中调用PCA算法
    python实现PCA算法原理
    PCA主成分分析算法的数学原理推导
    python表白实现代码(可视化与动画版)
    《C++ Primer Plus》第7章 函数——C++的编程模块 学习笔记
    C++函数指针
  • 原文地址:https://www.cnblogs.com/canaan233/p/13719325.html
Copyright © 2011-2022 走看看