【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]。
'''
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++代码实现
上一篇: Php socket数据编码
下一篇: 归并排序