目录
一、代码
'''
归并排序的主要思路:将两个有序的子列表归并为一个有序的大列表
'''
#归并函数,假设li是由左右两个有序的子列表组成,假设两个子列表都是从小到大排好序的列表
def merge(li,low,mid,high):
'''
:param li: 由左右两个有序的子列表组成的大列表
:param low: 列表的起始索引
:param mid: 两个子列表的分解处的索引,这里取前面子列表的最后一个元素的索引为mid
:param high: 大列表最后一个索引
:return: 从小到大排序的列表
'''
# 当列表中有两个元素时进行归并操作
i = low # 第一个子列表的起始索引
j = mid + 1 # 第二个子列表的起始索引比较好了的元素
lTmp = [] # 用于保存
while i <= mid and j <= high: # 当两个子列表都没有遍历完时
if li[i] > li[j]:
lTmp.append(li[j])
j += 1
else:
lTmp.append(li[i])
i += 1
while i <= mid:# 当右列表访问结束后,直接将左列表进行添加
lTmp.append(li[i])
i += 1
while j <= high:
lTmp.append(li[j])
j += 1
li[low:high+1] = lTmp
#归并排序
def mergeSorted(li,low,high):
'''
:param li: 列表
:param low: 列表起始索引
:param high: 列表结束索引
:return:
'''
if low < high: # 保证列表右两个元素
mid = (low + high)//2
mergeSorted(li,low,mid) # 对左列表进行排序
mergeSorted(li,mid+1,high) # 对右列表进行排序
merge(li,low,mid,high) # 将排好序的两个列表进行归并
if __name__ == '__main__':
import random
li = list(range(20)) # 随机生成20个数
random.shuffle(li) # 打乱
print(li,"未排序的列表")
print("---------------------------------------")
mergeSorted(li,0,len(li)-1)
print(li,"归并排序后的列表")
[11, 8, 13, 1, 4, 3, 18, 7, 14, 10, 19, 0, 9, 12, 2, 6, 5, 15, 17, 16] 未排序的列表
---------------------------------------
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 归并排序后的列表
二、随笔