归并排序O(nlogn)

先分治再合并

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[1000],t[1000];
void merge_sort(int A[],int x,int y,int T[]){
	if(y-x>1){
		int m=x+(y-x)/2;
		int i=x,j=m,k=x;
		merge_sort(A,x,m,T);//递归求解 
		merge_sort(A,m,y,T);
	  while(i<m||j<y){
	  	if(j>=y||(i<m&&A[i]<=A[j])) T[k++]=A[i++];
	  	else T[k++]=A[j++];
	  }
	  for(k=x;k<y;k++) A[k]=T[k];
	}
}
int main(){
	int n,i;
	while(cin>>n){
		for(i=0;i<n;i++)
		cin>>a[i];
		merge_sort(a,0,n,t);
		for(i=0;i<n;i++)
		cout<<a[i]<<' ';
		cout<<endl;
	}
	return 0;
}
posted @ 2018-08-15 17:33  ChunhaoMo  阅读(205)  评论(0)    收藏  举报