hdoj 1872 稳定排序 debug一天 吐血ac

题目1872

hdoj 1872 稳定排序 debug一天 吐血ac_第1张图片

code

#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;
}

之前本机跑通过但是无法ac的code

#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

遇到的问题

  • sort 和qsort

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);

  1. sort

sort函数,与qsort同为排序函数,复杂度为n*log2(n)。sort()定义在头文件中。sort函数是标准模板库的函数,已知开始和结束的地址即可进行排序,可以用于比较任何容器(必须满足随机迭代器),任何元素,任何条件,执行速度一般比qsort要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。
注意:缺省是升序排序。
sort 使用时得注明:using namespace std; 或直接打 std::sort() 还得加 #include

  1. 区别

(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了!!

你可能感兴趣的:(acm)