第一种思路,把两个数组合为一个数组然后再排序,问题又回归到冒泡和快排了,没有用到两个数组的有序性。(不好)
第二种思路,循环比较两个有序数组头位元素的大小,并把头元素放到新数组中,从老数组中删掉,直到其中一个数组长度为0。然后再把不为空的老数组中剩下的部分加到新数组的结尾。(好)
第二种思路的排序算法与测试代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def merge_sort(a, b): ret = [] while len (a)> 0 and len (b)> 0 : if a[ 0 ] < = b[ 0 ]: ret.append(a[ 0 ]) a.remove(a[ 0 ]) if a[ 0 ] > = b[ 0 ]: ret.append(b[ 0 ]) b.remove(b[ 0 ]) if len (a) = = 0 : ret + = b if len (b) = = 0 : ret + = a return ret if __name__ = = '__main__' : a = [ 1 , 3 , 4 , 6 , 7 , 78 , 97 , 190 ] b = [ 2 , 5 , 6 , 8 , 10 , 12 , 14 , 16 , 18 ] print (merge_sort(a, b)) |
反思了一下上面的过程,不应该用remove方法,因为仔细想一下remove方法可能比较耗时,不算最简单。
改进一下,改用索引元素比较法替代头位元素比较法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
def merge_sort(a, b): ret = [] i = j = 0 while len (a) > = i + 1 and len (b) > = j + 1 : if a[i] < = b[j]: ret.append(a[i]) i + = 1 else : ret.append(b[j]) j + = 1 if len (a) > i: ret + = a[i:] if len (b) > j: ret + = b[j:] return ret if __name__ = = '__main__' : a = [ 1 , 3 , 4 , 6 , 7 , 78 , 97 , 190 ] b = [ 2 , 5 , 6 , 8 , 10 , 12 , 14 , 16 , 18 ] print (merge_sort(a, b)) |
这个基本就是最简单的方法了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/LanTianYou/p/8976671.html