Fork me on GitHub

    归并排序英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(nlogn)

1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归

可以同时进行。

  当初为什么这个算法被发明,是为了解决什么实际问题,我尽量去搜索,可是,一直没找到答案。不过,可以肯定的是,

在这个计算机刚横空出世的年代,为了解决一些问题,发明这种算法就不足为奇了。

  该算法的操作步骤:

  1. 将序列每相邻两个数字进行归并操作,形成ceil(n/2)个序列,排序后每个序列包含两/一个元素
  2. 若此时序列数不是1个则将上述序列再次归并,形成ceil(n/4)个序列,每个序列包含四/三个元素
  3. 重复步骤2,直到所有元素排序完毕,即序列数为1

  python的代码实现:

def merge_sort(a_list):
        print("Splitting ",a_list)
        if len(a_list) > 1:
                mid = len(a_list) // 2
                left_half = a_list[:mid]
                right_half = a_list[mid:]

                merge_sort(left_half)
                merge_sort(right_half)
         
                i = 0
                j = 0
                k = 0

                while i < len(left_half) and j < len(right_half):
                        if left_half[i] < right_half[j]:
                                a_list[k] = left_half[i]
                                i = i + 1
                        else:
                                a_list[k] = right_half[j]
                                j = j + 1
    
                        k = k + 1
    
                while j < len(right_half):
                        a_list[k] = right_half[j]
                        j = j + 1
                        k = k + 1
                while i < len(left_half):
                        a_list[k] = left_half[i]
                        i = i + 1
                        k = k + 1

        print("Merging ", a_list)

a_list = [54,26,93,17,77,31,44,55,20]
merge_sort(a_list)
print a_list

 

 

参考文档:

1 https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F 

2 python解决数据结构和算法

posted on 2018-01-10 11:46  虚生  阅读(304)  评论(0编辑  收藏  举报