回 帖 发 新 帖 刷新版面

主题:sort()和qsort()的一些疑问

题目来自杭电的oj题,题号2020;参见这个网页http://acm.hdu.edu.cn/showproblem.php?pid=2020
我的代码如下
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
using namespace std;

int cmp(const int &a,const int &b)
{
    return abs(b)-abs(a);    


int main()
{
    int n,arr[100],i;
    while(scanf("%d",&n),n)
    {
        getchar();
        for(i=0;i<n;i++)
        {
            scanf("%d",&arr[i]);
        }
        //qsort(arr,n,sizeof(int),cmp);
        [b]sort(arr,arr+n,cmp);[/b]    
        for(i=0;i<n;i++)
        {
            printf("%d%c",arr[i],n-i-1?' ':'\n');
        }
    }
    return 0;
}
得不到测试数据的结果,而且发现似乎实现的功能是逆序输出,请问各位大牛这是什么原因呢?
另外,看到网上的一个解法是用.c写的,gcc编译
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int cmp(const int *a, const int *b)
{
    return abs(*b) - abs(*a);
}

int main(void)
{
    int n, i, x[101];
    
    while (scanf("%d", &n), n)
    {
        for (i = 0 ; i < n ; i++)
            scanf("%d", x + i);
        [b]qsort(x, n, sizeof(int), cmp);[/b]
        for (i = 0 ; i < n ; i++)
            printf("%d%c", x[i], (i != n - 1 ? ' ' : '\n'));
    }

    return 0;
}
但是如果用g++编译会报错,出错信息为invalid conversion from `int (*)(const int*, const int*)' to `int (*)(const void*, const void*)' 
请问这是为什么呢?

回复列表 (共2个回复)

沙发

#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;

//int __cdecl cmp( const void* a, const void* b)
//{
//    return abs( *(int*)b ) - abs( *(int*)a );
//}

bool cmp( const int& a, const int& b )
{
    return abs(a) > abs(b);
}

int main()
{
    for( int arr[100],n; cin>>n && n>0; )
    {
        for( int i=0; i<n; ++i )
            cin >> arr[i];

        //qsort( arr, n, sizeof(int),cmp);
        sort( arr, arr+n, cmp );

        for( int i=0; i<n; ++i )
            cout << arr[i] << ' ';
        cout << endl;
    }
    return 0;
}

板凳

#include <cmath>
#include <algorithm>
#include <iostream>

struct my_greater
{
  bool operator()( const int& a, const int& b ) const { return std::abs(b) < std::abs(a); }
};

int main()
{
  for( int arr[100],n; std::cin>>n && n>0; )
  {
    for( int i=0; i<n; ++i )
        std::cin >> arr[i];

    //qsort( arr, n, sizeof(int),cmp);
    std::sort(arr, arr + n, my_greater());
    for( int i=0; i<n; ++i )
        std::cout << arr[i] << ' ';
    std::cout << std::endl;
  }
  return 0;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册