归并排序模板题
Posted 桂林分晏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序模板题相关的知识,希望对你有一定的参考价值。
给定你一个长度为 n 的整数数列。
请你使用归并排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
难度:简单
时/空限制:1s / 64MB
总通过数:36007
总尝试数:53764
中心思想:
归并排序,它有两大核心操作.
一个是将数组一分为二,一个无序的数组成为两个数组.
另外一个操作就是,合二为一,将两个有序数组合并成为一个有序数组.
#include<iostream>
using namespace std;
const int N=1e6+10;
int a[N];
int tmp[N];
void merge_sort(int q[],int l,int r) {
if(l>=r) return ;
int mid=l+r>>1;
merge_sort(q,l,mid);
merge_sort(q,mid+1,r);
int k=0,i=l,j=mid+1;
while(i<=mid&&j<=r)
if(q[i]<=q[j]) tmp[k++]=q[i++];
else tmp[k ++]=q[j ++];
while(i<=mid) tmp[k ++]=q[i ++];
while(j<=r) tmp[k++]=q[j++];
for (i = l, j = 0; i <= r; i ++, j ++ ) q[i] = tmp[j];
}
int main() {
int n;
scanf("%d",&n);
for(int i=0; i<n; i++) scanf("%d",&a[i]);
merge_sort(a,0,n-1);
for(int i=0; i<n; i++) printf("%d ",a[i]);
return 0;
}
以上是关于归并排序模板题的主要内容,如果未能解决你的问题,请参考以下文章