为什么“qsort”功能不起作用?在我的代码中的标准库中工作?

发布于 2024-09-26 23:18:06 字数 577 浏览 1 评论 0原文

#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
struct island{  double left;           //gobal
                double right;
                } island[MAX];
...

int cmp(const void *ptr1,const void *ptr2 )           
{
    return (*(struct island*)ptr1).right >  (*(struct island*)ptr2).right;
}

qsort(island,num,sizeof(island[0]),cmp);    // "num" is the number of the input data

 //when I do print,it seems that if num<10 is right,else wrong
for(i=0;i<num;i++)          
    {
        printf("%g\t",island[i].right);
    }
#include<stdio.h>
#include<stdlib.h>
#define MAX 1000
struct island{  double left;           //gobal
                double right;
                } island[MAX];
...

int cmp(const void *ptr1,const void *ptr2 )           
{
    return (*(struct island*)ptr1).right >  (*(struct island*)ptr2).right;
}

qsort(island,num,sizeof(island[0]),cmp);    // "num" is the number of the input data

 //when I do print,it seems that if num<10 is right,else wrong
for(i=0;i<num;i++)          
    {
        printf("%g\t",island[i].right);
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

柠北森屋 2024-10-03 23:18:06

cmp 函数应该返回

  • 如果左侧值为 >
  • 您 值等于
  • 1 或更大值,如果如果左侧值 < 右侧值,则

-1 或更小您的比较仅返回 1(对于 > 情况)或 0 (所有其他情况)。

Your cmp function is supposed to return

  • 1 or greater if the left value is > the right value
  • 0 if the values are equal
  • -1 or less if the left value is < the right value

Your comparison only returns 1 (for the > case) or 0 (all other cases).

梦回旧景 2024-10-03 23:18:06

如果左侧项目大于右侧项目,您的 cmp 函数将返回 1,否则返回 0qsort 的文档指出:

 比较函数必须返回小于、等于或等于的整数
   如果第一个参数被认为是相关的,则大于零
   明显小于、等于或大于第二个。 

尝试一下您的比较功能:

int cmp(const void *ptr1, const void *ptr2)           
{
    double first = (*(struct island *)ptr1).right;
    double second = (*(struct island *)ptr2).right;
    if (first < second) return -1;
    else if (first > second) return 1;
    else return 0;
}

Your cmp function is returning 1 if the left item is greater than the right item, otherwise it's returning 0. The documentation for qsort states:

 The comparison function must return an integer less than, equal to,  or
   greater  than  zero  if  the first argument is considered to be respec‐
   tively less than, equal to, or greater than the second. 

Try this for your compare function:

int cmp(const void *ptr1, const void *ptr2)           
{
    double first = (*(struct island *)ptr1).right;
    double second = (*(struct island *)ptr2).right;
    if (first < second) return -1;
    else if (first > second) return 1;
    else return 0;
}
贪了杯 2024-10-03 23:18:06

来自 qsort 手册页:

比较函数必须返回小于、等于或等于的整数
如果第一个参数被认为是相关的,则大于零
明显小于、等于或大于第二个。如果有两个成员
比较相等,它们在排序数组中的顺序未定义。

在我看来,你们的 cmp 并没有这样做。

From the qsort man page:

The comparison function must return an integer less than, equal to, or
greater than zero if the first argument is considered to be respec‐
tively less than, equal to, or greater than the second. If two members
compare as equal, their order in the sorted array is undefined.

It looks to me like your cmp doesn't do that.

飘落散花 2024-10-03 23:18:06

cmp() 函数应返回 -1、0 或 1(或任何负数/0/任何正数)来表示给定对象的排序。你的函数返回 0 或 1。

尝试使用:

int cmp(const void *ptr1,const void *ptr2 )           
{
    return (*(struct island*)ptr2).right - (*(struct island*)ptr1).right;
}

the cmp() function should return -1, 0 or 1 (or any negative/0/any positive)to represent ordering of the given objects. your function returns 0 or 1.

try with:

int cmp(const void *ptr1,const void *ptr2 )           
{
    return (*(struct island*)ptr2).right - (*(struct island*)ptr1).right;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文