插入排序分治法归并排序
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算法=插入排序+分治思想+归并优化,其实就这么简单