• 007---归并排序


    归并排序

    原理:
    前提是必须确保这个列表左右两边有序
    例如:[2,5,7,8,9,1,3,4,6]
    以9为中心
    2 和 1比较 [].append(1)
    2 和 3比较 [1].append(2)
    3 和 5比较 [1,2].append(3)
    .
    .
    .
    最后得到新列表:[1,2,3,4,5,6,7,8,9]

    去除假设:利用递归。分解,合并,归并一步完成

    复杂度: O(NlogN) 当n等于16层时,他一共要执行4次func() 每一个func就是O(n) 所以就是 N * logN

    """
     1 def merge(li, low, mid, high):
     2     i = low
     3     j = mid + 1
     4     tmp = []
     5     while i <= mid and j <= high:
     6         if li[i] < li[j]:
     7             tmp.append(li[i])
     8             i += 1
     9         else:
    10             tmp.append(li[j])
    11             j += 1
    12 
    13     # while执行完毕后,肯定有一边先没数了
    14     while i <= mid:
    15         # 左边还有数,加到[]
    16         tmp.append(li[i])
    17         i += 1
    18     while j <= high:
    19         # 右边还有数,加到[]
    20         tmp.append(li[j])
    21         j += 1
    22     li[low:high + 1] = tmp
    23 
    24 def merge_sort(li, low, high):
    25     # 至少有两个元素
    26     if low < high:
    27         mid = (low + high) // 2
    28         merge_sort(li, low, mid)
    29         print(low,mid,high)
    30         merge_sort(li, mid + 1, high)
    31         merge(li, low, mid, high)
    32 
    33 li = [2, 5, 7, 8, 9, 1, 3, 4, 6]
    34 
    35 merge_sort(li, 0, 8)
    36 print(li)
  • 相关阅读:
    新·刷题记录【争取认真来做】
    Codeforces 235D Graph Game
    Codeforces 235B Let's Play Osu!
    Codeforces 235E Number Challenge
    Codeforces 235C Cyclical Quest
    AHOI2017游记
    bzoj4826: [Hnoi2017]影魔
    大数分解模板
    A new start
    0712
  • 原文地址:https://www.cnblogs.com/xjmlove/p/10278451.html
Copyright © 2020-2023  润新知