归并排序
【问题】使用归并排序法对列表中的数据排序。
分析:
简单归并排序是:
- 先把待排数据分成两部分,分别排序好。
- 再把这两个排序好的序列整理为一个新的有序列。
因为两个序列都是有序的,在重排序时,必须充分考虑这个优势。
具体的方案很简单,只要从两个序列的小端不断地取小的元素放到新序列中,直到某个列为空。
当某列为空时,就把另一个列直接加入到新列的队尾即可。
python实现方案:
def gui_bing(x):
def merge(a,b):
r = []
while len(a)>0 and len(b)>0:
if a[0] < b[0]:
r.append(a.pop(0))
else:
r.append(b.pop(0))
else:
r.extend(a)
r.extend(b)
return r
if len(x) < 2: return x
k = len(x) // 2
return merge(gui_bing(x[:k]),gui_bing(x[k:]))
if __name__ == '__main__':
print(gui_bing([4,6,7,8,1,2,4,3,5,8,1,2,4]))
这个排序法,对于小量的数据,可能感觉不到有什么不同。大量数据时, 效率也不是特别高。
但它的算法简单,可靠。在有些场合很有用。
考虑如下景象:
有两盘磁带,都已是排序好的。
现在要把两盘带上的数据合并到一起,输出到另一盘新带中。
这不正是 merge 函数要完成的事吗?