007---归并排序

Posted xjmlove

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于007---归并排序的主要内容,如果未能解决你的问题,请参考以下文章

十大经典排序之:归并排序 |桶排序

常见排序算法之归并排序——归并排序

归并排序

归并排序(递归非递归以及自然归并排序)算法总结

排序算法——归并排序

归并排序(逆序数问题)详解