C++多维排序

来源:互联网 发布:淘宝如何申请海外买手 编辑:程序博客网 时间:2024/05/16 06:53
明明的成绩表(Sort.cpp/pas)
【时限1s,内存128M】

题目描述:


明明有一堆学生的成绩,但是因为任性,就是不用Excel排序
所以....

输入格式:

第一行2个整数N,M
第2行到第N+1行,每行M个整数(某个学生的信息),代表了学生的班级,座号,身高,体重....等等

输出格式:

N*M的矩阵
把排序完的表输出(第一列为第一排序,第二列为第二排序...以此类推)
(详见Excel的自定义排序)


样例输入:

4 3
1 5 4
5 2 1
5 2 4
1 4 5

样例输出:

1 4 5
1 5 4
5 2 1
5 2 4

数据范围:
对于30%的数据满足:1<=n,m<=10
对于60%的数据满足:1<=n,m<=100

对于100%的数据满足:1<=n,m<=2000


分析:多维排序的裸题

直接贴上代码AC代码

#include<cstdio>using namespace std;struct tree{int b[3000];}a[3000];int n,m;void swap(int x,int y)//x行与y行交换 {for(int i=1;i<=m;i++){a[0].b[i]=a[x].b[i];a[x].b[i]=a[y].b[i];a[y].b[i]=a[0].b[i];}}void DIYsort(int left,int right,int now)//排序从第left行到第right行需要排序的数组的第now项 {//now表示当前处理到第now列 int i=left,j=right;int mid=a[(i+j)>>1].b[now];do{while(a[i].b[now]<mid)i++;while(mid<a[j].b[now])j--;if(i<=j){swap(i,j);i++;j--;}}while(i<=j);if(left<j)DIYsort(left,j,now);if(i<right)DIYsort(i,right,now);} void creat(int l,int r,int now)//对数组的排序另外处理 {//(第now列排序完成后,将now列的相同的归位一类,然后递归将这类继续往下排序) DIYsort(l,r,now);int left=l,right=-1;for(int i=l;i<=r;i++){if(a[i].b[now]==a[left].b[now])right++;else{if(right>0)creat(left,left+right,now+1);left=i;right=0;}}if(right>0)creat(left,left+right,now+1);}int fi()//因为规模很大, 需要快速读入{char ch=getchar();while(ch<'0'||ch>'9')ch=getchar();int aq=0;while(ch>='0'&&ch<='9'){aq=aq*10+ch-'0';ch=getchar();}return aq;}void read()//读入,调用到快速读入 {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)a[i].b[j]=fi();}void fo(int aq)//因为规模很大, 需要快速输出{if(aq>=10)fo(aq/10);putchar(aq%10+'0');}void print()//打印排序好的矩阵 {for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){fo(a[i].b[j]);putchar(32);}printf("\n");}}int main(){read();//读入 creat(1,n,1);//排序 print();//输出 return 0;} 



0 0
原创粉丝点击