一.采用分治策略:将原问题划分成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. 【Java并发编程实战】—–synchronized

    在我们的实际应用其中可能常常会遇到这样一个场景:多个线程读或者.写相同的数据,訪问相同的文件等等.对于这样的情况假设我们不加以控制,是非常easy导致错误的. 在java中,为了解决问题,引入临界区概 ...

  2. 《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问

        老板让让做一个东东.输入端要用到opencv顺便就来学习一下.买了本书<学习opencv>翻来一看,opencv1.0,去官网上一看.opencv2.49,瞬间有种蛋碎的赶脚.看着 ...

  3. HDU1237 简单计算器 【栈】+【逆波兰式】

    简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  4. 32.QT绘图

    widget.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPainter> #inclu ...

  5. [读书笔记] Python 数据分析 (十一)经济和金融数据应用

    resample: 重采样函数,可以按照时间来提高或者降低采样频率,fill_method可以使用不同的填充方式. pandas.data_range 的freq参数枚举: Alias Descrip ...

  6. python的父类和子类中关于继承的不同版本的写法

    Python 2.7中的继承 在Python 2.7中,继承语法稍有不同,ElectricCar 类的定义类似于下面这样: class Car(object): def __init__(self, ...

  7. 查看Linux系统信息命令

    系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...

  8. Python-基础-day5

    1.内置函数 2.文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open ...

  9. 【hihocoder 1519】 逃离迷宫II

    [题目链接]:http://hihocoder.com/problemset/problem/1519?sid=1098756 [题意] Chinese [题解] bfs题; 根据bfs的性质; 第一 ...

  10. jvm 虚拟机参数_栈内存分配

    1.参数 -Xss 指定线程最大的栈空间,整个参数也直接决定了函数可调用的最大深度 2.测试代码 private static int count; public static void addCou ...