Excel可以对一组纪录按任意指定列排序。现请编写程序实现类似功能。
输入格式:
输入的第一行包含两个正整数N(≤105) 和C,其中N是纪录的条数,C是指定排序的列号。之后有 N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,保证没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩([0, 100]内的整数)组成,相邻属性用1个空格隔开。
输出格式:
在N行中输出按要求排序后的结果,即:当C=1时,按学号递增排序;当C=2时,按姓名的非递减字典序排序;当C=3时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。
输入样例:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
输出样例:
000001 Zoe 60
000007 James 85
000010 Amy 90
先说一个部分正确部分超时的自己写的快排的改变
#include <bits/stdc++.h>
using namespace std;
struct node
{
char s[10],b[10];
int data;
};
struct node a[101000];
void paixu1(int l,int r)
{
if(l>=r)
return;
int i=l,j=r;
struct node x;
x=a[l];
while(i<j)
{
while(i<j&&strcmp(a[j].s,x.s)>0) j--;
a[i]=a[j];
while(i<j&&strcmp(a[i].s,x.s)<0) i++;
a[j]=a[i];
}
a[i]=x;
paixu1(l,i-1);
paixu1(i+1,r);
}
void paixu2(int l,int r)
{
if(l>=r)
return;
int i=l,j=r;
struct node x;
x=a[l];
while(i<j)
{
while(i<j)
{
if(strcmp(a[j].b,x.b)>0)
j--;
else if(strcmp(a[j].b,x.b)==0&&strcmp(a[j].s,x.s)>0)
j--;
else
break;
}
a[i]=a[j];
while(i<j)
{
if(strcmp(a[i].b,x.b)<0)
i++;
else if(strcmp(a[i].b,x.b)==0&&strcmp(a[i].s,x.s)<0)
i++;
else
break;
}
a[j]=a[i];
}
a[i]=x;
paixu2(l,i-1);
paixu2(i+1,r);
}
void paixu3(int l,int r)
{
if(l>=r)
return;
int i=l,j=r;
struct node x=a[l];
while(i<j)
{
while(i<j)
{
if(a[j].data>x.data)
j--;
else if(a[j].data==x.data&&strcmp(a[j].s,x.s)>0)
j--;
else
break;
}
a[i]=a[j];
while(i<j)
{
if(a[i].data<x.data)
i++;
else if(a[i].data==x.data&&strcmp(a[i].s,x.s)<0)
i++;
else
break;
}
a[j]=a[i];
}
a[i]=x;
paixu3(l,i-1);
paixu3(i+1,r);
}
int main()
{
int n,c,i;
scanf("%d %d",&n,&c);
for(i=1;i<=n;i++)
{
scanf("%s %s %d",a[i].s,a[i].b,&a[i].data);
}
if(c==1)
{
paixu1(1,n);
}
else if(c==2)
{
paixu2(1,n);
}
else{
paixu3(1,n);
}
for(i=1;i<=n;i++)
printf("%s %s %d\n",a[i].s,a[i].b,a[i].data);
return 0;
}
然后再说一个不超时的算法,
用了c++的库函数,但是不知道为什么不超时…
#include <bits/stdc++.h>
using namespace std;
int c;
struct node
{
char s[10],b[10];
int data;
};
struct node a[101000];
bool cmp(node a,node b)
{
if(c==1)
return strcmp(a.s,b.s)<0;
else if(c==2)
{
if(strcmp(a.b,b.b)==0)
return strcmp(a.s,b.s)<0;
return strcmp(a.b,b.b)<0;
}
else if(c==3)
{
if(a.data==b.data)
return strcmp(a.s,b.s)<0;
return a.data<b.data;
}
}
int main()
{
int n,i;
scanf("%d %d",&n,&c);
for(i=1;i<=n;i++)
{
scanf("%s %s %d",a[i].s,a[i].b,&a[i].data);
}
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++)
printf("%s %s %d\n",a[i].s,a[i].b,a[i].data);
return 0;
}