#include
#include
#include
using namespace std;
struct node{
char name[50];
int score;
int order;//!!!!没有这个就无法让他排序
}a[305],b[305];
bool cmp1(node a,node b){
if(a.score==b.score)
return a.order<b.order;// 升序
else
return a.score>b.score; //降序
}
int main(){
int n;//number of student
while(scanf("%d",&n)==1)
{
int flag1=0,flag2=0;
for(int i=0;i<n;i++){//a
scanf("%s %d",a[i].name,&a[i].score);
a[i].order=i;
}
sort(a,a+n,cmp1);
//for(int i=0;i
//printf("%s %d\n",a[i].name,a[i].score);
//}
for(int i=0;i<n;i++){//b
scanf("%s %d",b[i].name,&b[i].score);
}
//将a排为正确的,方便比较与后面的比较
for(int i=0;i<n;i++)
{
if(a[i].score!=b[i].score){// 成绩不等时 error
flag2=1;
}
else if(strcmp(a[i].name,b[i].name)!=0){
flag1=1;
}
//else{// 成绩等 名字等
// flag2=0;
// flag1=0;
//break;!!!!!!!!!debug1h 气哭
//}
}
if(flag1==1&&flag2==0){
printf("Not Stable\n");
for(int i=0;i<n;i++){
printf("%s %d\n",a[i].name,a[i].score);
}
}
else if(flag2==1){
printf("Error\n");
for(int i=0;i<n;i++){
printf("%s %d\n",a[i].name,a[i].score);
}
}
else if(flag1==0&&flag2==0){
printf("Right\n");
}
}
return 0;
}
#include
#include
#include
using namespace std;
struct node{
char name[50];
int score;
int order;//!!!!!!!!!!!!!!没有这个就无法让他排序
}a[305],b[305];
bool cmp1(node a,node b){
if(a.score==b.score)
return a.order<b.order;// 升序
else
return a.score>b.score; //降序
}
int main(){
int n;//number of student
while(scanf("%d",&n)==1)
{
for(int i=0;i<n;i++){//a
scanf("%s %d",a[i].name,&a[i].score);
a[i].order=i;
}
sort(a,a+n,cmp1);
//for(int i=0;i
//printf("%s %d\n",a[i].name,a[i].score);
//}
for(int i=0;i<n;i++){//b
scanf("%s %d",b[i].name,&b[i].score);
}
//将a排为正确的,方便比较与后面的比较
int flag1=10000,flag2=10000;
for(int i=0;i<n;i++){
if(a[i].score!=b[i].score){// 成绩不等时 error
flag2=1;
break;///⚠️ 问题出在这
}
else if(a[i].score==b[i].score){
// 成绩等
if(strcmp(a[i].name,b[i].name)!=0){
flag2=0;///⚠️ 问题出在这
flag1=1;
break;///⚠️ 问题出在这
}
else{// 成绩等 名字等//
flag2=0;
flag1=0;
//break;!!!!!!!!!debug1h 气哭
}
}
}
////
if(flag1==1&&flag2==0){
printf("Not Stable\n");
for(int i=0;i<n;i++){
printf("%s %d\n",a[i].name,a[i].score);
}
}
else if(flag2==1){
printf("Error\n");
for(int i=0;i<n;i++){
printf("%s %d\n",a[i].name,a[i].score);
}
}
else if(flag1==0&&flag2==0){
printf("Right\n");
}
}
return 0;
}
对于错误/不稳定的情况 内部设立2个flag
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )
int compare (const void *elem1, const void *elem2 ) );
qsort(quicksort)主要根据你给的比较条件给一个快速排序,主要是通过指针移动实现排序功能。排序之后的结果仍然放在原来数组中。
base:需要排序的目标数组开始地址
num:目标数组元素个数
width:目标数组中每一个元素长度
compare:函数指针,指向比较函数(这个函数是要自己写的,sort中默认升序)
4)对结构体一级排序
struct In
{
double data;
int other;
}s[100]
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写
int cmp( const void *a ,const void *b)
{
return (*(In *)a).data > (*(In *)b).data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),cmp);
sort函数,与qsort同为排序函数,复杂度为n*log2(n)。sort()定义在头文件中。sort函数是标准模板库的函数,已知开始和结束的地址即可进行排序,可以用于比较任何容器(必须满足随机迭代器),任何元素,任何条件,执行速度一般比qsort要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。
注意:缺省是升序排序。
sort 使用时得注明:using namespace std; 或直接打 std::sort() 还得加 #include
(1)最直观的差别,函数形式不一样,
qsort的使用方式为:
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )
sort的使用方式为:
template
void sort ( RandomAccessIterator first, RandomAccessIterator last );
template
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
sort有二个参数与三个参数版本,两个参数默认升序排序,第三个参数可用于指定比较函数,调整排序方式。
(2)compare函数的写法也是不一样的。
qsort的compare函数写法为:int
int compare (const void *elem1, const void *elem2 ) );
sort的compare函数返回的是bool值;
参考博客:https://blog.csdn.net/lkn910907/article/details/44085015
在struct中要有 order;//!!!没有这个cmp就无法让他排序!!!!!
正确的情况下没有 break;!!!debug1h 气
否则就只比了一次就break了!!