zoukankan      html  css  js  c++  java
  • 算法 时间复杂度, 空间复杂度, 冒泡排序**, 选择排序, 插入算法, 快速排序**, 希尔算法,计数排序, 二分法查找**

     时间复杂度

     小结:

    空间复杂度

    算法可视化网站推荐

    https://visualgo.net/zh

    冒泡排序

     

    ### 冒泡排序 (************)
    ### 时间复杂度:最差的情况:O(n^2)  最好的情况:O(n)   空间复杂度:O(1)  并没有开辟新的储存空间
    def bubble_sort(li):
        for i in range(len(li)-1):
            flag = True   #用于优化
            for j in range(len(li)-1-i):
                if li[j] > li[j+1]:
                    li[j], li[j+1] = li[j+1], li[j]
                    flag = False
            if flag:
                return
    
    li = [7,5,4,6,3,8,2,9,1]
    bubble_sort(li)
    print(li)

    选择排序

    ### 选择排序
    ### 时间复杂度是:O(n^2)
    def select_sort(li):
        for i in range(len(li)):
            minLoc = i
            for j in range(i+1, len(li)):
                if li[minLoc] > li[j]:
                    li[minLoc], li[j] = li[j], li[minLoc]

    插入算法

    ### 插入排序
    ### 时间复杂度是:O(n^2)
    def insert_sort(li):
    
        for i in range(1, len(li)):  ### i=2
            tmp = li[i] ## tmp=li[2]=4
            j = i - 1  ### j = 1 li[1]=7
    
            while j >= 0 and li[j] > tmp:
                li[j+1] = li[j]  ### [5,7,7,6,3,8,2,9,1]  ==> [5,5,7,6,3,8,2,9,1]
                j = j - 1   ### j = 0  j= -1
    
            li[j+1] = tmp

    优化空间: 应用二分查找来寻找插入点

    小结:

    快速排序

    # 快排
    ##### 时间复杂度是:O(nlogn)
    def partition(li, left, right):  #### O(n)
        tmp = li[left]
        while left < right:
            while left < right and li[right] >= tmp:
                right = right - 1
            li[left] = li[right]
            while left < right and li[left] <= tmp:
                left = left + 1
            li[right] = li[left]
    
        li[left] = tmp
        return left
    
    def quick_sort(li, left, right):
    
        if left < right:
            mid = partition(li, left, right)  ### 归位函数
    
            quick_sort(li, left, mid-1)     #### O(logn)
            quick_sort(li, mid+1, right)
    
    li = [7,5,4,6,3,8,2,9,1]
    quick_sort(li,0,len(li)-1)
    print(li)

    上述4中方法时间比较

    import time,random
    
    start = time.time()
    li = [random.randint(0,100000) for i in range(10000)]
    bubble_sort(li)
    print('bubble_sort:',time.time()-start) # 8.805101871490479
    
    start = time.time()
    li = [random.randint(0,100000) for i in range(10000)]
    select_sort(li)
    print('select_sort',time.time()-start)  # 4.129027366638184
    
    start = time.time()
    li = [random.randint(0,100000) for i in range(10000)]
    insert_sort(li)
    print('insert_sort',time.time()-start)  # 3.236048460006714
    
    start = time.time()
    li = [random.randint(0,100000) for i in range(10000)]
    quick_sort(li,0,len(li)-1)
    print('quick_sort',time.time()-start)   # 0.029005050659179688

    希尔算法(了解)

     

     

     代码:

     

    小结:

     

    计数排序(了解)

    # 假如有一列数组为
    # [7,5,4,6,3,8,2,9,1,9]    对他进行计数
    # [0,1,1,1,1,1,1,1,1,2]    代表0有0个,1有1个,2有1个...9有2个  
    # 计数排序
    def count_sort(li):     # 因为时间复杂度没有系数,所以整体复杂度算O(n)
        count = [0 for _ in range(10)]
        print(count)    # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    
        for k in li:    # 此循环时间复杂度O(m)
            count[k] += 1
        print(count)    # [0, 1, 1, 1, 1, 1, 1, 1, 1, 2]
    
        li.clear()
        # 下面循环时间复杂度O(n)
        for k,v in enumerate(count):
            for i in range(v):  # 这层时间复杂度可以忽略不计
                li.append(k)
    
    li = [5,7,4,6,3,8,2,9,1,9]
    count_sort(li)
    print(li)   # [1, 2, 3, 4, 5, 6, 7, 8, 9, 9]

    算法拓展:

    动态规划 贪心(分糖果,人民币问题) 背包问题

    力扣题:https://leetcode-cn.com/

    二分法查找

     

     

    ##### 二分查找 时间复杂度O(logn)
    def bin_search(li, value , low, high):
    
        if low<=high:
            mid = (low+high) // 2
    
            if li[mid] == value:
                return mid
            elif li[mid] > value:
                return bin_search(li, value, low, mid-1)
            else:
                return bin_search(li, value, mid+1, high)
        else:
            return
    
    li = [1,2,3,4,5,6,7,8,9]
    index = bin_search(li, 3, 0, len(li)-1)
    print(index)
  • 相关阅读:
    Spring知识点回顾(09)异步调用
    Spring知识点回顾(07)事件发布和监听
    Spring知识点回顾(08)spring aware
    Spring知识点回顾(06)Profile 和 条件注解 @Conditional
    Spring知识点回顾(04)el 和资源使用
    Spring知识点回顾(05)bean的初始化和销毁
    Spring知识点回顾(01)Java Config
    Spring知识点回顾(02)AOP
    Spring知识点回顾(03)Bean的 Scope
    HTTPS 原理
  • 原文地址:https://www.cnblogs.com/ludingchao/p/12622542.html
Copyright © 2011-2022 走看看