`

排序算法学习(python版本)之归并排序(MergeSort)

阅读更多
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

最差时间复杂度:O(nlogn)
最优时间复杂度:O(n)
平均时间复杂度:O(nlogn)


归并操作归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。
[编辑]算法描述归并操作的过程如下:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针达到序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

归并排序具体工作原理如下(假设序列共有n个元素):

  1. 将序列每相邻两个数字进行归并操作,形成个序列,排序后每个序列包含两个元素
  2. 将上述序列再次归并,形成个序列,每个序列包含四个元素
  3. 重复步骤2,直到所有元素排序完毕

代码:
示例一
#!/usr/bin/env python
#-*-encoding:utf-8-*-

def merge_sort(lst):
    if(len(lst) <= 1): return lst
    left = merge_sort(lst[:len(lst)/2])
    right = merge_sort(lst[len(lst)/2:len(lst)])
    result = []
    while len(left) > 0 and len(right)> 0:
        if( left[0] > right[0]):
            result.append(right.pop(0))
        else:
            result.append(left.pop(0))

    if(len(left)>0): result.extend(merge_sort(left))
    else: result.extend(merge_sort(right))
    return result

def main():
    L = [22,11,55,33,66]
    print merge_sort(L)

if __name__=="__main__":
    main()

示例二
#!/usr/bin/env python
#-*-encoding:utf-8-*-

def merge_sort(List):
    mid=int(len(List)/2)
    if len(List)<=1:return List
    return merge(merge_sort(List[:mid]),merge_sort(List[mid:]))

def merge(l1,l2):
    final=[]
    l1 = sorted(l1)
    l2 = sorted(l2)
    while l1 and l2:
        if l1[0]<=l2[0]:
            final.append(l1.pop(0))
        else:
            final.append(l2.pop(0))
    return final+l1+l2

def main():
    L = [22,11,55,33,66]
    print merge_sort(L)

if __name__=="__main__":
    main()


参考资料:
http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
分享到:
评论

相关推荐

    归并排序算法

    归并排序是一种经典的排序算法,基于“分治”策略。它的基本思想是将大问题分解成小问题来解决,然后再将解决的小问题合并成大问题的解。在归并排序中,我们将一个大数组分成两个小数组,分别对这两个小数组进行排序...

    归并算法的代码

    在提供的`Src`文件中,可能包含了使用特定编程语言(如Python、Java、C++等)实现的归并排序代码,新手可以通过阅读和理解这些代码来学习归并排序的工作原理和实现细节。 归并排序的时间复杂度是O(n log n),空间...

    Python实现各种排序算法的代码示例总结

    在计算机科学领域中,排序算法是基础且重要的组成部分之一。本文将详细介绍几种经典的排序算法,并通过 Python 语言实现这些算法。Python 作为一种高级编程语言,因其简洁易读的特点而成为学习算法的理想选择。 ###...

    105、第6课 统计数字--归并排序(count)--2020.03.23a.pdf

    根据提供的文件内容,本文将详细解读归并排序算法以及与之相关的编程实现。归并排序是一种有效的、稳定的排序算法,具有时间复杂度为O(nlogn)的特点。在教学少儿编程NOIP和CSP-J(计算机软件能力认证)的过程中,...

    归并排序 C++实现

    归并排序是一种经典的排序算法,基于“分治”策略,由计算机科学家John W. Backus在1945年提出。这种排序方法将一个大问题分解为小问题,然后逐个解决,最后将解决的结果合并成原问题的解。归并排序在C++中的实现...

    汇编编写的快排+合并排序

    在学习这两个文件时,你不仅可以了解到快速排序和归并排序的基本原理,还能深入理解汇编语言如何实现这些高级算法,这对于提升底层编程能力,特别是在性能敏感的应用场景中,如嵌入式系统或实时计算,都是非常有价值...

    Python库 | usort-0.6.2.tar.gz

    `usort`库可能会包含一些高级排序算法,如快速排序(quicksort)、归并排序(mergesort)或堆排序(heapsort)。这些算法相对于Python内置的TimSort算法,在特定场景下可能提供更快的排序速度,尤其是在处理大规模...

    了解Python中的这种mergesort实现

    在Python编程语言中,归并排序(Mergesort)是一种高效的、稳定的排序算法,它采用了分治(Divide and Conquer)策略。这个算法的基本思想是将大问题分解为小问题来解决,然后合并这些小问题的解,最终得到大问题的...

    Princeton Quicksort

    5. 与其他排序算法的比较:文档中提到了快速排序与归并排序(Mergesort)以及其他多种语言的系统排序算法的比较,如Java对于对象和基本类型的不同排序实现,以及C、Unix、Visual C++、Python、Matlab、Chrome ...

    algorithm templates and leetcode examples in Python3, you .zip

    1. **排序算法**:如快速排序(quicksort)、归并排序(mergesort)、插入排序(insertionsort)、选择排序(selectionsort)以及堆排序(heapsort)。它们用于对数据进行有序排列,理解每种算法的时间复杂度和适用...

    GESP-Python23.9月五级.pdf

    - 上题的归并排序算法中,`Left, Right = mergeSort(listData[:Middle]), mergeSort(listData[Middle:])`体现了分治策略,即将问题拆分成两半分别解决。 以上是对Python五级考试中涉及的一些核心知识点的详细解析...

    algorithm-python:编码面试的算法实践

    1. 排序算法:快速排序(quicksort.py)、归并排序(mergesort.py)、堆排序(heapsort.py)。 2. 搜索算法:二分查找(binary_search.py)、线性查找(linear_search.py)、回溯搜索(backtracking.py)。 3. 图...

    浅析python中numpy包中的argsort函数的使用

    - `kind`:用于指定排序算法,如'quicksort'(快速排序,默认)、'mergesort'(归并排序,稳定)或'heapsort'(堆排序)。 - `order`:用于控制排序时考虑数组的字段顺序,通常在排序结构化数组时使用。 了解了...

    Algorithm

    此外,还有快速排序(QuickSort)、归并排序(MergeSort)和插入排序(InsertionSort)等经典算法,可以通过自定义函数实现。 2. 查找算法:线性查找(Linear Search)是最基础的查找方法,但效率较低。二分查找...

    PythonNotes:Python Notes,一些algorithmdatastruct和leetcode的答案

    1. **排序与搜索**:快速排序(quicksort)、归并排序(mergesort)、二分查找(binary search)等。 2. **递归与回溯**:用于解决复杂问题的方法,如斐波那契序列、八皇后问题等。 3. **动态规划**:解决最优化...

    LeetCode问题

    6. **排序和搜索算法**:快速排序(quicksort)、归并排序(mergesort)、二分查找(binary search)等是常见题目。理解它们的原理和实现方式对提高解题效率有很大帮助。 7. **动态规划**:动态规划是一种优化技术...

Global site tag (gtag.js) - Google Analytics