POJ1007DNA,sort函数与qsort函数区别

POJ 1007 DNASORT原题链接:POJ1007!!

这道题就是表面看上去的那么简单,直接做就可以了,我做这道题的时候,遇到了一个细节上的问题,可能是之前学习的时候没有学好;是关于sort函数,与qsort函数的
例如用 排序
qsort函数内的cmp 函数,判断的返回值是 一个整数
int cmp(const void *a,const void *b)
{
Node *x=(Node *)a;
Node *y=(Node *)b;
return x->num-y->num;
}
x->num-y->num; 则代表是从小到大排序,为负数则不动,为正数则交换,相等不交换
y->num-x->num ;则代表是从打到小排序,为负数则不动,为正数则交换,相等不交换
其实从大到小也可以这样写 return -(x->num-y->num);

但是sort函数内置的cmp函数就不一样了,返回值不是一个整型,而是bool型
bool cmp(Node& a,Node& b)
{
return a.num<b.num;
}

a.num<b.num;则代表从小到大排序; true则不交换,false交换
a.num>b.num;则代表从大到小排序;true 则不交换,false 交换
我这里犯了错误就是,用减法,不管大小与否,只要不是相等都会返回一个非零值,非零值即为true 也就是说除了相等情况,判断永远返回true,这就造成了你可能会发现使用了sort函数,跟没使用是一样的。。。
。。。为此,我wa了两发。。。细节没处理好, 我认了…

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node
{
    char str[55];
    int num;
    bool operator <(const Node &a)const
    {
        return num<a.num;
    }
}node[105];
int n,m;
int runnum(char* s)
{
    int a,c,g,ans;
    a=c=g=ans=0;
    for(int i=n-1;i>=0;i--)
    {
        switch(s[i])
        {
            case 'a':case 'A':a++;break;
            case 'c':case 'C':c++;ans+=a;break;
            case 'g':case 'G':g++;ans+=a;ans+=c;break;
            case 'T':case 't':ans+=a;ans+=c;ans+=g;break;
        }
    }
    return ans;
}
/*
int cmp(const void *a,const void *b)
{
    Node *x=(Node *)a;
    Node *y=(Node *)b;
    return x->num-y->num;
}
*/
int cmp(Node& a,Node& b)
{
    return a.num<b.num;
}
void go()
{
    while(cin>>n>>m)
    {
        for(int i=0;i<m;i++)
        {
            cin>>node[i].str;
            node[i].num=runnum(node[i].str);
        }
        sort(node,node+m);
       // qsort(node,m,sizeof(Node),cmp);
        for(int i=0;i<m;i++)
        {
            cout<<node[i].str<<endl;
        }
    }
}
int main()
{
    go();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值