一.采用分治策略:将原问题划分成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代码

import sys

def merge(A, start, middle, end):
arr_left = A[start : middle + 1]
arr_right = A[middle + 1 : end + 1] i = 0;
j = 0; left_len = len(arr_left)
right_len = len(arr_right) for n in range(start, end + 1):
if arr_left[i] <= arr_right[j]:
A[n] = arr_left[i]
i = i + 1
if i >= left_len:    #左边的已经比较完,直接将剩下的右边赋值给A
A[n+1 : n + right_len - j + 1] = arr_right[j : ]
return None
else:
A[n] = arr_right[j]
j = j + 1
if j >= right_len: #右边的已经比较完,直接将剩下的左边赋值给A
A[n+1 : n + left_len - i + 1] = arr_left[i : ]
return None def merge_sort(A, start, end):
if start < end:
middle = (end + start) / 2 merge_sort(A, start, middle)
merge_sort(A, middle + 1, end)
merge(A, start, middle, end) def main(argv=None):
A = [9, 3, 10, 34, 25, 11, 100, 29, 64, 82, 55, 43, 73] print "before : ", A merge_sort(A, 0, len(A) - 1) print "after : ", A if __name__ == "__main__":
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. MMORPG大型游戏设计与开发(server 游戏场景 事件)

    游戏截图 场景事件 一个完整的对象一般都拥有事件,至于什么是事件在这里就不多解释了. 在场景中的事件在天龙/武侠世界中的事件包含场景初始化.场景定时器.场景退出.玩家进入场景.角色升级.角色死亡.角色 ...

  2. SOA概念具体解释

    1.概述 1.1基本定义 SOA(Service-Oriented Architecture)既面向服务的体系结构,是一个组件模型.它将应用程序猿的不同功能可是(称为服务)通过定义良好的接口联系起来. ...

  3. jQuery插件 -- Cookie插件

    Cookie是站点设计者放置在client的小文本文件.Cookie能为用户提供非常多的使得,比如购物站点存储用户以前浏览过的产品列表.或者门户站点记住用户喜欢选择浏览哪类新闻. 在用户同意的情况下. ...

  4. How to remove focus without setting focus to another control?

    How to remove focus without setting focus to another control? Ask Question up vote 67 down vote favo ...

  5. WINDOWS系统注册表(读、写)

    读取注册表 写入注册表

  6. 彻底解决降级安装失败无法彻底卸载应用bug

    彻底解决魅族手机无法彻底卸载应用bug使用Flyme系统的同学可能会遇到一个问题:卸载了某些软件(例如通过开发者模式调试安装的应用)后,实际这个应用还残留在系统,当你用低版本或者其他签名的apk覆盖安 ...

  7. popupwindows

    <1>.能够点击popupwindow 内部空间,外部触摸消失,外部点击事件. package myapplication.com.myapplication; import androi ...

  8. OracleRef游标

    提到个思考:怎样让游标作为参数传递? 解决这个问题就需要用到 REF Cursor . 1,什么是 REF游标?  动态关联结果集的临时对象.即在运行的时候动态决定执行查询.   2,REF 游标有什 ...

  9. socket代码(简单)

    SERVER: #!/usr/bin/python # -*- coding: utf-8 -*- import socket import time s = socket.socket(socket ...

  10. VSCode Debug模式下各图标 含义

    按钮1:运行/继续 F5,真正的一步一步运行 按钮2:单步跳过(又叫逐过程) F10,按语句单步执行.当有函数时,不会进入函数. 按钮3:单步调试(又叫逐语句) F11:当有函数时,点击这个按钮,会进 ...