NOJ 1002归并排序

来源:互联网 发布:java ee api 编辑:程序博客网 时间:2024/06/05 08:50

归并排序

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

给定一个数列,用归并排序算法把它排成升序。

输入:

第一行是一个整数n(n不大于10000),表示要排序的数的个数;
下面一行是用空格隔开的n个整数。

输出:

输出排序后的数列,每个数字占一行。

输入样例:

53 2 1 4 5

输出样例:

12345

源代码:

#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++];    }}

 

0 0
原创粉丝点击