插入排序分治法归并排序

Posted wdl1078390625

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序分治法归并排序相关的知识,希望对你有一定的参考价值。

插入排序思想:

  1.先从一串元素中随机取出一个元素,置于数组A中;其他元素置于数组B中;

  2.遍历数组B中的每一个元素,将每个元素以正确的顺序置入数组B中。

插入排序算法时间复杂度:Θ(n2)


分治法思想:

  1.分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。

  2.解决这些子问题,递归求解各子问题。若子问题的规模足够小,则直接求解。

  3.合并这些子问题的解成原问题的解。

 

 

归并排序思想(基于分治法):

  1.将一串元素分为两半,分别存储于数组A及数组B中;

  2.对数组A及数组B重复第一步,直至所得数组的元素个数为1;

  3.对所得数组往上递归排序。

归并排序算法时间复杂度:Θ(nlgn)

技术分享图片
 1 import random
 2 
 3 
 4 def main(args):
 5     a = []
 6     for i in range(10):
 7         a.append(random.randint(1,100))
 8     print(a)
 9     merge_sort(a,0,len(a)-1)
10     print(a)
11     return 0
12     
13 def merge(a,n,m):
14     r = ( n + m )// 2
15     b = []
16     c = []
17     for i in range(n,r+1):
18         b.append(a[i])
19     for i in range(r+1,m+1):
20         c.append(a[i])
21     i = 0
22     j = 0
23     index_a = n
24     while len(b) > i and len(c) > j:
25         if b[i] >= c[j]:
26             a[index_a] = b[i]
27             i += 1
28         else:
29             a[index_a] = c[j]
30             j += 1
31         index_a += 1
32     else:
33         if len(b) == i:
34             for k in range(j,len(c)):
35                 a[index_a] = c[k]
36                 index_a += 1
37         else:
38             for k in range(i,len(b)):
39                 a[index_a] = b[k]
40                 index_a += 1
41     
42 def merge_sort(a,n,m):
43     if n < m:
44         merge_sort(a,n,((n+m)//2))
45         merge_sort(a,((n+m)//2)+1,m)
46         merge(a,n,m)
47     
48     
49 if __name__ == __main__:
50     import sys
51     sys.exit(main(sys.argv))
归并排序

 


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

算法之-归并排序算法,插入排序算法

分治法 实现归并排序

jdk8源码legacyMergeSort算法=插入排序+分治思想+归并优化,其实就这么简单

jdk8源码legacyMergeSort算法=插入排序+分治思想+归并优化,其实就这么简单

排序——归并排序(分治法)

python代码实现归并排序(Merge Sort )