NOJ 1002归并排序

归并排序

时限: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++];     } }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值