• 算法--插入排序


    插入排序

    列表被分为有序区和无序区两个部分。最初有序区只有一个元素。

    每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。

    【就好比打牌,摸牌,手里的牌是有序的,桌子上的牌是无序的,从桌子上最上面摸一张牌,插入到手里的牌里面】


    代码关键点:

    • 摸到的牌
    • 手里的牌

    图一: 红色有序区, 白色无序区

    图二: 从无序区拿出一个值

    图三:

    图四: 插入到有序区

    python代码实现:

    li = [1, 2, 3, 7, 5, 9, 4, 8, 1]
    
    
    def insert_sort(li):
        for i in range(1, len(li)):  # 第一个位置的值初识化为有序区,索引从1开始
            temp = li[i]  # 把无序区第一个位置的值拿出来(新摸到的一张牌)
            j = i - 1  # 有序区最后一个位置的索引
            while j >= 0 and temp < li[j]:  # 两个终止条件: 1.j<0,索引越界,说明temp是最小的
                li[j + 1] = li[j]  # 把有序区最后一个位置的值往后移一格
                j -= 1
            li[j + 1] = temp
            # 两个终止条件: 1. j=-1,说明temp最小,放到最前面
            #              2. 一上来,无序区第一个值就大于有序区最后一个值
    
    
    insert_sort(li)
    print(li)

    时间复杂度:O(n2)

    空间复杂度:O(1)

    优化空间:应用二分查找来寻找插入点(并没有什么卵用)

      注意while j >= 0 and temp < li[j]: 两个条件的顺序


    布尔运算的短路功能

    1 > 2 and 3 < 4 

    python做了优化, 前面不满足,后面就不判断了

    不用if写一个if语句

    def func():
        print(11)
    
    a = 1
    
    a < 0 and func()
    
    a > 0 and func()
    # 11
  • 相关阅读:
    散列函数之单散列算法
    NET 使用 RabbitMQ
    leetCode
    Swift 1
    C#并发集合
    多进程与多线程1
    开发编译器
    APUE1
    微服务架构
    ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/12891369.html
Copyright © 2020-2023  润新知