实现合并排序:
首先归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。这样说起来可能很难理解,于是给出一张我画的图。
这里显示了归并排序的第一步,将数组按照middle进行递归拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序。
两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后被放入空数组的那个位置的指针往后 移一个,然后继续和另外一个数组的上一个位置进行比较,以此类推。到最后任何一个数组先出栈完,就将另外i一个数组里的所有元素追加到新数组后面。
由于递归拆分的时间复杂度是logN 然而,进行两个有序数组排序的方法复杂度是N该算法的时间复杂度是N*logN 所以是NlogN。
根据这波分析,我们可以看看对上图的一个行为。
当最左边的分到最细之后无法再划分左右然后开始进行合并。
第一次组合完成[4, 7]的合并
第二次组合完成[4, 7, 8]的合并
第三次组合完成[3, 5]的合并
第四次组合完成[3, 5, 9]的合并
第五次组合完成[3, 4, 5, 7, 8, 9]的合并结束排序。
# -*- coding: utf-8 -*- # @Time : 18-9-18 上午10:59 # @Author : Guo Zhengbing # @Email : cn_gzb@126.com #产生一个1000个元素的数组 import random def random_int_list(start, stop, length): start, stop = (int(start), int(stop)) if start <= stop else (int(stop), int(start)) length = int(abs(length)) if length else 0 random_list = [] for i in range(length): random_list.append(random.randint(start, stop)) return random_list a = random_int_list(1,1000,20) #合并排序 def MergeSort(lists): if len(lists) <= 1: return lists mid = len(lists)//2 #递归 listA = MergeSort(lists[:mid]) listB = MergeSort(lists[mid:])
""" print("========listA========") print(listA) print("========listB========") print(listB)
""" return MergeSortedLists(listA, listB) #合并两个有序数集 def MergeSortedLists(listA, listB): newList = list() a = 0 b = 0 # Merge the two lists together until one is empty while a < len(listA) and b < len(listB): if listA[a] < listB[b]: newList.append(listA[a]) a += 1 else: newList.append(listB[b]) b += 1 # If listA contains more items,append them to newList while a < len(listA): newList.append(listA[a]) a += 1 while b < len(listB): newList.append(listB[b]) b += 1 return newList # If listB contains more items,append them to newList if __name__ == "__main__": lists = a print(lists) result = MergeSort(lists) print("排序前:", a) print("排序后:", result)
输出:
[748, 256, 946, 364, 496, 807, 758, 689, 274, 767, 962, 534, 434, 481, 464, 538, 652, 547, 483, 472] 排序前: [748, 256, 946, 364, 496, 807, 758, 689, 274, 767, 962, 534, 434, 481, 464, 538, 652, 547, 483, 472] 排序后: [256, 274, 364, 434, 464, 472, 481, 483, 496, 534, 538, 547, 652, 689, 748, 758, 767, 807, 946, 962] Process finished with exit code 0