一.采用分治策略:将原问题划分成n个规模较小的但结构和原问题相同的子问题,递归解决这些子问题后合并各个结果从而得到原问题的解。

二.分治策略的步骤:

  • 分解:将原问题分解成一系列子问题
  • 解决:子问题粒度足够小、能直接求解则直接求解,子问题不能直接求解则继续递归分解为更小的子问题
  • 合并:将子问题的结果合并为原问题的解

总的来说就是递归分解问题至能直接求解,然再将各子问题的结果合并在一起从而得到原问题的解

三.归并排序(以整数排序为例)

  3.1将待排序的数组为左右两个组单独排序,然后合并左右两个已排序好的数组,不断递归这个过程知道数组大小为1

  3.2伪代码

    merge_sort(A, start, end)  //A为待排序数组, start和end分别为需要排序的部分的开始和结束的元素下标

      if start < end      //问题不能直接求解,需要分解

        m = (start + end) / 2     //找出中间位置

        merge_sort(start, m)  //对左半部分排序

        merge_sort(m+1, end)  //对右半部分排序

        merge(A, start, m, end) //合并左右两部分

  3.3merge(A, start, m, end)函数

   A为数组, start、m和end为开始、中间和结束下标

   merge(A, start, m, end)

    left_size = m - start

    right_size = end - m + 1

    L[left_size] = {0}

    R[right_size] = {0}

    for i = 0 to (left_size -1)

      L[i] = A[start+i]

    for j = 0 to (right_size -1)

      R[j] = A[m + j]

    i = 0

    j = 0

    for n = start to end

      if L[i] <= R[j]

        A[n] = L[i]

        ++i

      else

        A[n] = R[j]

        ++j

四.Python代码

  1. import sys
  2.  
  3. def merge(A, start, middle, end):
  4. arr_left = A[start : middle + 1]
  5. arr_right = A[middle + 1 : end + 1]
  6.  
  7. i = 0;
  8. j = 0;
  9.  
  10. left_len = len(arr_left)
  11. right_len = len(arr_right)
  12.  
  13. for n in range(start, end + 1):
  14. if arr_left[i] <= arr_right[j]:
  15. A[n] = arr_left[i]
  16. i = i + 1
  17. if i >= left_len:    #左边的已经比较完,直接将剩下的右边赋值给A
  18. A[n+1 : n + right_len - j + 1] = arr_right[j : ]
  19. return None
  20. else:
  21. A[n] = arr_right[j]
  22. j = j + 1
  23. if j >= right_len: #右边的已经比较完,直接将剩下的左边赋值给A
  24. A[n+1 : n + left_len - i + 1] = arr_left[i : ]
  25. return None
  26.  
  27. def merge_sort(A, start, end):
  28. if start < end:
  29. middle = (end + start) / 2
  30.  
  31. merge_sort(A, start, middle)
  32. merge_sort(A, middle + 1, end)
  33. merge(A, start, middle, end)
  34.  
  35. def main(argv=None):
  36. A = [9, 3, 10, 34, 25, 11, 100, 29, 64, 82, 55, 43, 73]
  37.  
  38. print "before : ", A
  39.  
  40. merge_sort(A, 0, len(A) - 1)
  41.  
  42. print "after : ", A
  43.  
  44. if __name__ == "__main__":
  45. sys.exit(main())

运行结果:

归并排序(Python)的更多相关文章

  1. 归并排序python实现

    归并排序python实现 归并排序 归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法 首先是一个例子 原序先通过一半一半的拆分,然后: 然后再一步一步的向上合并,在合并的过 ...

  2. 归并排序python实现源码

    将开发过程经常用到的一些代码片段收藏起来,下面的资料是关于归并排序python实现的代码,应该能对码农们有一些用. def mergesort(arr): if len(arr) == 1: retu ...

  3. 经典算法之归并排序——python和JS实现

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:韩忠康 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  4. 归并排序-Python实现

    归并排序(MergeSort) 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 O(n\log n)(大O符号).1945年由约翰·冯·诺 ...

  5. 归并排序Python 实现

    一.归并排序   -归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分合策略(将问题分(divide)成一些小的问题然后递归求解,而合的阶段则将分的阶段得到的各答案&q ...

  6. 高速排序,归并排序,堆排序python实现

    高速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*l ...

  7. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  8. python数据结构与算法——归并排序

    归并排序: 原理与C语言实现 参考:白话经典算法系列之五 归并排序的实现 1. 容易对有序数组A,B进行排序. 2. 为了使得A,B组内数据有序:可以将A,B组各自再分成二组. 3. 经过不断分组,当 ...

  9. 你需要知道的九大排序算法【Python实现】之归并排序

    四.归并排序 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.归并过程:比 ...

随机推荐

  1. 数据结构(Java语言)——LinkedList简单实现

    下面是一个能够使用的LinkedList泛型类的实现.这里的链表类名为MyLinkedList,避免与类库中反复. MyLinkedList将作为双链表实现,并且保留到该表两端的引用.这样仅仅要操作发 ...

  2. javaScript实现日历控件

    近期学习js.闲来无事就写了个简单的日历控件.不知道别人是怎么实现的.纯粹自己想法写的, 写的不好 ,但能够起到抛砖引玉的作用. 先来看效果. watermark/2/text/aHR0cDovL2J ...

  3. Cocos2d-x 3.0 红孩儿私家必修 - 第一章 初识Cocos2d-x 3.0project

    第一章    初识Cocos2d-x 3.0project Cocos2d-x 3.0出来了,听说与之前版本号相比修改较大 做为一个游戏开发人员.我们应该欢迎Cocos2d-x持续的更新和强大,Coc ...

  4. UVA - 11722 Joining with Friend 几何概率

                            Joining with Friend You are going from Dhaka to Chittagong by train and you ...

  5. 使用Chrome插件Postman进行简单的Get/Post测试

    转自:https://blog.csdn.net/dearmorning/article/details/56854236 Postman插件: 一种网页调试与发送网页http请求的chrome插件, ...

  6. 17.UNP第一章 简介

    获取时间的客户端代码: //客户端程序 #include "unp.h" int main(int argc, char **argv) { int sockfd, n; ]; s ...

  7. BZOJ 2819 DFS序+线段树

    非递归的DFS写炸了- 交了一个递归版的 过了---.. //By SiriusRen #include <cstdio> #include <cstring> #includ ...

  8. python学习——正则表达式

    正则表达式                        正则表达式的主要作用就是对字符串进行匹配,通过匹配,进行筛选,选择出符合规则的字符串.其实正则表达式的作用就像是一个过滤器一样.你输入好自己的 ...

  9. 《鸟哥的Linux私房菜》笔记——03. 磁盘分区

    Everything is a file. 常见硬件对应于 Linux 下的文件(/dev目录下) 装置 装置在Linux内的档名 SCSI/SATA/U盘硬盘机 /dev/sd[a-p] U盘 /d ...

  10. iOS开发-测量APP启动耗时

    冷启动 冷启动就是App被kill掉以后一切从头开始启动的过程. 热启动 当用户按下home键的时候,iOS的App并不会马上被kill掉,还会继续存活若干时间.理想情况下,用户点击App的图标再次回 ...