欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【S-排序】python实现八大排序算法之7-归并排序

程序员文章站 2022-06-04 17:14:43
...

归并排序

描述
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。

【S-排序】python实现八大排序算法之7-归并排序

'''
Creat by HuangDandan
2018-08-16
aaa@qq.com

归并排序和快速排序一样采用了分治的方法
思想:通常按此用递归的方法进行归并法编程
归并排序的算法我们通常用递归实现

步骤:
1-编写归并函数,对列表中的元素进行归并,用temp函数保存列表从小到大的元素值并返回
2-归并排序函数,先把待排序区间[s,t]以中点二分,接着把左边子区间递归排序,再把右边子区间递归排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]

难点:
1-如何调用归并函数 递归法和迭代法 通常采用递推法,下面的程序采用的就是递推法
2-归并的过程,归并的两个列表leftLst和RightLst中各自元素是不是有序的?Yes
 在归并排序MergeSort中,先将列表的元素分为左右两个列表中的元素,再依次将两个列表中的元素再进行左右划分
'''


def Merge(LeftLst, RightLst):   #归并过程,比较两边的列表的元素值,将其从小到大放入temp列表中,返回temp列表值
    temp = []
    i = 0
    j = 0
    while i < len(LeftLst) and j < len(RightLst):
        if LeftLst[i] < RightLst[j]:
            temp.append(LeftLst[i])
            i += 1
        else:
            temp.append(RightLst[j])
            j += 1
    #循环结束,其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到temp列表中,
    #python切片的效果等同于while或者for循环
    temp += LeftLst[i:]
    temp += RightLst[j:]
    # while i < len(LeftLst):
    #    temp.append(LeftLst[i])
    # while j < len(RightLst):
    #     temp.append(RightLst[j])
    return temp

#对Lst[]切片进行归并并排序
def MergeSort(Lst):     #归并排序过程,列表只有一个元素的时候直接返回元素,列表不止两个元素的时候会调用Merge函数
    if len(Lst) <=1:
        return Lst
    Mid = len(Lst)//2
    LeftList = MergeSort(Lst[0:Mid])    #左边递归排序
    RightList = MergeSort(Lst[Mid:len(Lst)])    #右边递归排序
    return Merge(LeftList,RightList)    #左右序列归并

if __name__ == "__main__":
    Lst1 = [1,4,5,2,55,44,66,77,66,66,88,1]
    print(Lst1)
    print("----------------------------------------")
    print(MergeSort(Lst1))

参考博客:
http://python.jobbole.com/82270/ https://www.jb51.net/article/123676.htm python代码实现
https://blog.csdn.net/ns_code/article/details/20306991 C++代码实现

相关标签: python mergesort