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

归并排序

描述
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(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]。

这里写图片描述

'''
Creat by HuangDandan
2018-08-16
[email protected]

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

步骤:
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++代码实现

猜你喜欢

转载自blog.csdn.net/u010591976/article/details/81810103