Fork me on GitHub

随笔 - 997  文章 - 5  评论 - 181  阅读 - 300万 

    归并排序英语: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   虚生  阅读(307)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示