787. 归并排序1
给定你一个长度为 n n n 的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数
n
n
n。
第二行包含
n
n
n 个整数(所有整数均在 1∼109 范围内),表示整个数列。
输出格式
输出共一行,包含 n n n 个整数,表示排好序的数列。
数据范围
1 ≤ n ≤ 100000 1≤n≤100000 1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
思路:
将一个区间分为左右两个区间(本文以中间值为分界点),然后左右递归。再将两个区间进行归并。时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
代码:
# 归并排序模板
def merge_sort(data,l,r):
if l >= r:
return
mid = l + r >> 1
# 左右递归
merge_sort(data,l,mid)
merge_sort(data,mid+1,r)
# 用来临时保存归并好的一组数据
tmp = []
i = l
j = mid + 1
# 归并过程
while i <= mid and j <= r:
if data[i] <= data[j]:
tmp.append(data[i])
i += 1
else:
tmp.append(data[j])
j += 1
# 当一边已经结束后直接把另一边的剩余数据加入到tmp中
tmp += data[i:mid+1]
tmp += data[j:r+1]
# 将结果返回到data中
data[l:r+1] = tmp
n = int(input())
data = [int(x) for x in input().split()]
merge_sort(data,0,n-1)
print(" ".join(map(str,data)))
题目来源:AcWing ↩︎