第一种思路,把两个数组合为一个数组然后再排序,问题又回归到冒泡和快排了,没有用到两个数组的有序性。(不好)
第二种思路,循环比较两个有序数组头位元素的大小,并把头元素放到新数组中,从老数组中删掉,直到其中一个数组长度为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