归并排序
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
给定一个数列,用归并排序算法把它排成升序。
输入:
第一行是一个整数n(n不大于10000),表示要排序的数的个数;
下面一行是用空格隔开的n个整数。
输出:
输出排序后的数列,每个数字占一行。
输入样例:
5 3 2 1 4 5
输出样例:
1 2 3 4 5
源代码:
#include <stdio.h> #include <stdlib.h> #include <limits.h> using namespace std; void mergesort(int arr[],int p,int r); void merge(int arr[],int p,int q,int r); int main(){ int n; int a[10002]; int i; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); mergesort(a,0,n-1); for(i=0;i<n;i++) printf("%d\n",a[i]); return 0; } void mergesort(int arr[],int p,int r){ int q; if(p<r){ q=(r+p)/2; mergesort(arr, p, q); mergesort(arr,q+1,r); merge(arr,p,q,r); } } void merge(int arr[],int p,int q,int r){ int len1=q-p+1; int len2=r-q; int i,j,k; int *L=new int[len1+1]; int *R=new int[len2+1]; for(i=0;i<len1;i++) L[i]=arr[p+i]; for(j=0;j<len2;j++) R[j]=arr[q+1+j]; L[len1]=R[len2]=INT_MAX; i=0; j=0; for(k=p;k<=r;k++) { if(L[i]<R[j]) arr[k]=L[i++]; else arr[k]=R[j++]; } }