AcWing 787. 归并排序-python
原题链接
简单
作者:
Actor丶
,
2020-03-01 17:47:40
,
所有人可见
,
阅读 839
"""
基本思想:
1. 确定分界点索引,mid=(l+r)//2
2. 递归排序[left,mid]和[mid+1,right]两部分
3. *归并:按序合并[left,mid]和[mid+1,right]两部分到tmp数组
"""
def mergeSort(alist, l, r):
if l>=r: return
mid = (l+r)//2
mergeSort(alist, l, mid)
mergeSort(alist, mid+1, r)
# 合并:遍历比较alist数组中[l,mid]和[mid+1,r]两部分的元素,小的元素存到tmp中
k = 0 # 存tmp数组中元素的个数
i = l # 左半部分的指针
j = mid+1 # 右半部分的指针
while i<=mid and j<=r:
if alist[i]<alist[j]:
tmp[k] = alist[i]
k+=1
i+=1
else:
tmp[k] = alist[j]
k+=1
j+=1
# 将合并的剩余部分的数组元素存到tmp的后面
while i<=mid:
tmp[k] = alist[i]
k+=1
i+=1
while j<=r:
tmp[k] = alist[j]
k+=1
j+=1
# 将排序好的tmp数组存到alist对应部分中
i = l # alist的指针,从left开始
j = 0 # tmp的指针,从0开始
while i<=r:
alist[i] = tmp[j]
i+=1
j+=1
if __name__=="__main__":
n = int(input().strip())
nums = list(map(int, input().split()))
tmp = [0]*n # 一维数组可以这么生成,二维数组不行
mergeSort(nums, 0, n-1)
[print(item, end=" ") for item in nums]