回 帖 发 新 帖 刷新版面

主题:c++ qsort help!

#include<iostream>
using namespace std;
struct in
{
  int data;
  char str[100];

};
int cmp(const void*a,const void*b)
{
  return strcmp( (*(in*)a)->str,(*(in*)b)->str);
}
int main()
{ in s[100];int i;
   for(i=0;i<3;i++)
   cin>>s[i].data>>s[i].str;
   qsort(s,3,sizeof(s[0]),cmp);
   for(i=0;i<3;i++)
   cout<<s[i].str;

  return 0;
}
其中的快排方法网上搜的,但编译总是错误,不知为什么,help me please!

回复列表 (共3个回复)

沙发

(*(in*)a)->str
是个什么意思呀?
(*(in*)a) 是个对象,而不是指针。并且它又没重载 operator ->,你后面用“->”是何意?

板凳

如果用C++,建议使用std::sort代替C语言的qsort。
其实这两个东东在设计思路上比较类似,排序的算法已经写好了,只要你指定一个“规则”,就能按照这个规则进行排序。如何指定规则呢?答案就是楼主的那个cmp函数。

这个函数应该怎样编写?根据C语言的标准,它的原型是int cmp(const void* a, const void* b);
函数有两个参数,都是指针,分别指向需要排序的数组中的一个元素,并且两个指针不会指向同一个元素。函数返回int,如果返回值为负,则说明第一个元素应该排在第二个元素的前面;如果返回值为正,则说明第一个元素应该排在第二个元素的后面;如果返回值为零,则不论哪个元素排在前面均可(还记得吗?快速排序是不稳定的排序法,所以相等的两个元素在排序之后的顺序是难以确定的)。

根据这个规则,我们可以这样写:
int cmp(const void* a, const void* b) {
    const in* pa = (const in*)a;
    const in* pb = (const in*)b;
    return strcmp(pa->str, pb->str);
}

合成一句就是:
    return strcmp(((const in*)a)->str, ((const in*)b)->str);

3 楼

你好.我是全职网赚工作者.
如果你有时间有电脑.
想在网络上创业.请联系我..
项目绝对真实.详情QQ空间资料
加盟请联系 QQ908889846

我来回复

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