1002.归并排序
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
给定一个数列,用归并排序算法把它排成升序。
输入
第一行是一个整数n(n不大于10000),表示要排序的数的个数;
下面一行是用空格隔开的n个整数。
下面一行是用空格隔开的n个整数。
输出
输出排序后的数列,每个数字占一行。
输入样例
5
3 2 1 4 5
3 2 1 4 5
输出样例
1
2
3
4
5
2
3
4
5
#include <stdio.h> #include <stdlib.h> void guibing(int a[],int l,int r) { int i = l; int mid = (l+r)/2; int j = mid+1; int k = 0; int *temp = (int *)malloc((r-l+1)*sizeof(int)); while(i<=mid&&j<=r) { if(a[i]<=a[j]) temp[k++]=a[i++]; else temp[k++]=a[j++]; } while(i<=mid) temp[k++] = a[i++]; while(j<=r) temp[k++] = a[j++]; for(i=0;i<(r-l+1);i++) a[l+i] = temp[i]; free(temp); } void devide(int a[],int i,int j) { if(i<j) { int mid = (i+j)/2; devide(a,i,mid); devide(a,mid+1,j); guibing(a,i,j); } } int main() { int i,n,a[10001]; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); devide(a,0,n-1); for(i=0;i<n;i++) printf("%d ",a[i]); return 0; }
C++实现(STL)
#include <iostream> #include <algorithm> #include <stdio.h> using namespace std; int main() { int n,i; int a[10001]; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); for(i=0;i<n;i++) { printf("%d ",a[i]); } return 0; }
STL里面的sort是快排,快排是目前最快的排序算法之一。