归并排序模板题

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;
}





以上是关于归并排序模板题的主要内容,如果未能解决你的问题,请参考以下文章

算法笔记——归并排序及其基础面试题

归并排序思想及java模板代码

排序问题之归并排序

归并排序模板(ACwing 787)

归并排序(归并排序求逆序对数)--16--归并排序--Leetcode面试题51.数组中的逆序对

PAT:归并排序与快速排序模板