目錄
?
一、代碼
二、隨筆
一、代碼
'''
歸并排序的主要思路:將兩個有序的子列表歸并為一個有序的大列表
'''#歸并函數,假設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 += 1else:lTmp.append(li[i])i += 1while i <= mid:# 當右列表訪問結束后,直接將左列表進行添加lTmp.append(li[i])i += 1while j <= high:lTmp.append(li[j])j += 1li[low:high+1] = lTmp#歸并排序
def mergeSorted(li,low,high):''':param li: 列表:param low: 列表起始索引:param high: 列表結束索引:return: '''if low < high: # 保證列表右兩個元素mid = (low + high)//2mergeSorted(li,low,mid) # 對左列表進行排序mergeSorted(li,mid+1,high) # 對右列表進行排序merge(li,low,mid,high) # 將排好序的兩個列表進行歸并if __name__ == '__main__':import randomli = 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] 歸并排序后的列表
二、隨筆
?
?