merge sort template

void merge_sort(int a[], int l, int r){
	//只有一个或者没有则不用排序 
	if(l >= r) return ;
	int mid = (l + r) >> 1; //取中间值为分界 
	merge_sort(a, l, mid);  //左边区间右边区间进行递归 
	merge_sort(a, mid + 1, r);
	int k = 0, i = l, j = mid + 1;
	
	while(i <= mid && j <= r){
		if(a[i] < a[j]) tmp[k++] = a[i++];
		else tmp[k++] = a[j++];
	}
	while(i <= mid) tmp[k++] = a[i++];
	while(j <= r) tmp[k++] = a[j++];
	
	//将排好序的数组存回来 
    //注意这里i是从l到r
	for(i = l, j = 0; i <= r; i++, j++)	a[i] = tmp[j]; 
}

 


787. Merge Sort

 

You are given a sequence of integers of length n.

Please use merge sort to sort this sequence from small to large.

and output the sorted arrays in order.

input format

The input consists of two lines, the first line contains the integer n.

The second line contains n integers (all in the range 1 to 109109), representing the entire sequence.

output format

The output is one line, containing n integers, representing a sorted sequence.

data range

1≤n≤1000001≤n≤100000

Input sample:

5
3 1 2 4 5

Sample output:

1 2 3 4 5

 

Code:

#include<iostream>
#include<stdio.h>
using namespace std;
const int N = 1e6 + 10;
int a[N], tmp[N]; 

void merge_sort(int a[], int l, int r){
	//只有一个或者没有则不用排序 
	if(l >= r) return ;
	int mid = (l + r) >> 1; //取中间值为分界 
	merge_sort(a, l, mid);  //左边区间右边区间进行递归 
	merge_sort(a, mid + 1, r);
	int k = 0, i = l, j = mid + 1;
	
	while(i <= mid && j <= r){
		if(a[i] < a[j]) tmp[k++] = a[i++];
		else tmp[k++] = a[j++];
	}
	while(i <= mid) tmp[k++] = a[i++];
	while(j <= r) tmp[k++] = a[j++];
	
	//将排好序的数组存回来 
	for(i = l, j = 0; i <= r; i++, j++)	a[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++){
    	if(i != n)	printf("%d ", a[i]);
    	else printf("%d\n", a[n]);
	}
	return 0;
	
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=326312819&siteId=291194637