python 归并排序的实现

 更新时间:2024年06月18日 08:28:52   作者:youyouxiong  
归并排序是一种分治算法,它将数组分成两半,分别对这两半进行排序,然后将排序后的两半合并在一起,本文就来介绍一下python 归并排序的实现,具有一定的参考价值,感兴趣的可以了解一下

Python客栈送红包、纸质书

一、归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之),将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,若将两个有序表合并成一个有序表,称为二路归并。

二、归并排序的基本思想

将待排序序列R[0…n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列

三、归并排序的算法描述

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

归并排序其实要做两件事:

(1)“分解”——将序列每次折半划分(递归实现)

(2)“合并”——将划分后的序列段两两合并后排序

如何合并?
在每次合并过程中,都是对两个有序的序列段进行合并,然后排序。

这两个有序序列段分别为 R[low, mid] 和 R[mid+1, high]。

先将他们合并到一个局部的暂存数组R2中,带合并完成后再将R2复制回R中。

我们称 R[low, mid] 第一段,R[mid+1, high] 为第二段。

每次从两个段中取出一个记录进行关键字的比较,将较小者放入R2中,最后将各段中余下的部分直接复制到R2中。

经过这样的过程,R2已经是一个有序的序列,再将其复制回R中,一次合并排序就完成了。

四、代码实现过程(python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2  # 找到中间索引
        L = arr[:mid]  # 左半部分
        R = arr[mid:]  # 右半部分
 
        merge_sort(L)  # 递归地排序左半部分
        merge_sort(R)  # 递归地排序右半部分
 
        # 合并两个有序数组
        i = j = k = 0
 
        # 复制数据到临时数组L[]
        while i < len(L) and j < len(R):
            if L[i] < R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1
 
        # 复制左半部分剩余的数据
        while i < len(L):
            arr[k] = L[i]
            i += 1
            k += 1
 
        # 复制右半部分剩余的数据
        while j < len(R):
            arr[k] = R[j]
            j += 1
            k += 1
 
# 测试代码
arr = [12, 11, 13, 5, 6, 7]
print("未排序的数组:", arr)
merge_sort(arr)
print("排序后的数组:", arr)

这个例子中,merge_sort函数首先找到数组的中间索引,然后将数组分为两部分,递归地对这两部分进行排序。最后,使用一个循环将排序后的两个数组合并为一个有序数组。

到此这篇关于python 归并排序的文章就介绍到这了,更多相关python 归并排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/youyouxiong/article/details/139753090

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • python利用 pytesseract快速识别提取图片中的文字((图片识别)

    python利用 pytesseract快速识别提取图片中的文字((图片识别)

    本文介绍了tesseract的python调用,也就是pytesseract库,其中还有一些其他的内容并没有涉及,仅涉及到了图片提取文字,如果你对其感兴趣,可以深入探索一下,也希望能和我探讨一下
    2022-11-11
  • 对Python中画图时候的线类型详解

    对Python中画图时候的线类型详解

    今天小编就为大家分享一篇对Python中画图时候的线类型详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python实战练习之终于对肯德基下手

    Python实战练习之终于对肯德基下手

    读万卷书不如行万里路,学的扎不扎实要通过实战才能看出来,本篇文章手把手带你爬下肯德基的官网,大家可以在过程中查缺补漏,看看自己掌握程度怎么样
    2021-10-10
  • Python中os.path.join函数的用法示例详解

    Python中os.path.join函数的用法示例详解

    这篇文章主要给大家介绍了关于Python中os.path.join函数用法的相关资料,os.path.join函数是Python标准库中的一个函数,用于将多个路径组合成一个有效的路径,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • python opencv 图像处理之图像算数运算及修改颜色空间

    python opencv 图像处理之图像算数运算及修改颜色空间

    这篇文章主要介绍了python opencv 图像处理之图像算数运算及修改颜色空间,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-08-08
  • Python的SQLAlchemy框架使用入门

    Python的SQLAlchemy框架使用入门

    这篇文章主要介绍了Python的SQLAlchemy框架使用入门,SQLAlchemy框架是Python中用来操作数据库的ORM框架之一,需要的朋友可以参考下
    2015-04-04
  • 使用PySpark实现数据清洗与JSON格式转换的实践详解

    使用PySpark实现数据清洗与JSON格式转换的实践详解

    在大数据处理中,PySpark 提供了强大的工具来处理海量数据,特别是在数据清洗和转换方面,本文将介绍如何使用 PySpark 进行数据清洗,并将数据格式转换为 JSON 格式的实践,感兴趣的可以了解下
    2023-12-12
  • django 文件上传功能的相关实例代码(简单易懂)

    django 文件上传功能的相关实例代码(简单易懂)

    这篇文章主要介绍了django 文件上传功能的相关实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • python中数组array和列表list的基本用法及区别解析

    python中数组array和列表list的基本用法及区别解析

    大家都知道数组array是同类型数据的有限集合,列表list是一系列按特定顺序排列的元素组成,可以将任何数据放入列表,且其中元素之间没有任何关系,本文介绍python中数组array和列表list的基本用法及区别,感兴趣的朋友一起看看吧
    2022-05-05
  • Python全栈之单项循环

    Python全栈之单项循环

    这篇文章主要为大家介绍了Python单项循环,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11

最新评论