归并排序(Python)

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

运行结果:

时间: 2024-08-07 00:12:01

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

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

前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:韩忠康 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun 算法 归并排序(merge-sort),典型的分治策略(divide and conquer).核心思路是将整体序列一分为二形成两个子序列,分别对子序列排序,再将两个有序子序列合并成一个有序序列. 思路如图: 整体过程分为拆分和合并两大阶段. 拆分,核

快速排序,归并排序,堆排序python实现

快速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是稳定的排序 堆排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是不稳定的排序 1.快速排序 快速排序的介绍以及C语言实现在这里:快速排序C语言实现 本文介绍的是快速排序python实现: de

利用Python实现归并排序

利用python进行归并排序,摘抄自http://blog.csdn.net/minxihou/article/details/51821052 "代码真的不是一气呵成的,而且也不是想当然写出来的.可能需要反复断点中断来查看是否有逻辑错误.在理解了问题的基础下我们需要先把大体的代码框架最好先写出来,特别是主要的逻辑判断语句.但是不需要太care我循环体或者判断里面语句怎么实现,当你把这一步做到的时候能避免很多不必要的错误发生." 1 import random 2 3 def Conf

python实现归并排序,归并排序的详细分析。

学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的.很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚的伙伴可以看下我之前发表的文章http://www.cnblogs.com/Lin-Yi/p/7301535.html看完之后也许你会对时间复杂度有一个新的认识. 我谈的观点往往不是官方的定义,我希望能帮助更多基础薄弱的同学读懂思想~ 归并排序: 先分开再合并,分开成单个元素,合并的时候按照正确顺序合

排序算法分析【五】:归并排序(附Python&amp;C++代码)

归并排序:将两个已经排序的串行合并成一个串行的操作. 算法原理 先看动态图: 算法描述如下: 申请空间,使其大小为两个已经排序串行之和,该空间用来存放合并后的串行: 设定两个指针,最初位置分别为两个已经排序串行的起始位置: 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置: 重复步骤3直到某一指针到达串行尾: 将另一串行剩下的所有元素直接复制到合并串行尾. 算法实现 Python版: #-*- encoding: utf-8 -*- def merge_sort(l

python中的归并排序

本来在博客上看到用python写的归并排序的程序,然后自己跟着他写了一下,结果发现是错的,不得不自己操作.而自己对python不是很了解所以就变百度边写,终于在花了半个小时之后就写好了. def merge(a, first, end, temp): if first < end: mid = (first+end)//2 merge(a, first, mid, temp) #前半部分拍好序 merge(a, mid+1, end, temp) #后半部分拍好序 merger(a, first

JavaScript算法 ,Python算法,Go算法,java算法,系列之【归并排序】篇

常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n).1945年由约翰·冯·诺伊曼首次提出.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行. 作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法: 自上而下的递归(所有递归的方法都可以用

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

归并排序: 原理与C语言实现 参考:白话经典算法系列之五 归并排序的实现 1. 容易对有序数组A,B进行排序. 2. 为了使得A,B组内数据有序:可以将A,B组各自再分成二组. 3. 经过不断分组,当分出来的小组只有一个数据时(有序),合并相邻二个小组. 这样通过先递归的分解数列,再合并数列就完成了归并排序. 代码摘自<Python Algorithm> 1 # 对数组seq进行归并排序 2 # 返回排序后数组 3 def mergesort(seq): 4 mid = len(seq)//2

python数据结构与算法 34 归并排序

归并排序 在提高排序算法性能的方法中,有一类叫做分而治之.我们先研究其中第一种叫做归并排序.归并排序使用递归的方法,不停地把列表一分为二.如果列表是空或只有一个元素,那么就是排好序的(递归基点),如果列表有超过1个的元素,那么切分列表并对两个子列表递归使用归并排序.一旦这两个列表排序完成,称为"归并"的基本操作开始执行.归并是把两个有序列表合并成一个新的有序列表的过程.图10是我们熟悉的列表样例分解过程,图11是归并的过程. 图10  切分过程 图11  归并过程 以下是mergeSo