【问题标题】:how compare works in qsort() function比较如何在 qsort() 函数中工作
【发布时间】:2019-02-22 22:45:34
【问题描述】:

我在<stdlib.h> 中阅读了qsort() 的用法,如qsort() 所述。该函数的语法是:

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

这个函数需要一个排序函数compare()如下:

int compare (const void * a, const void * b)
{
  return ( *(int*)a - *(int*)b );
}

使用此函数,qsort() 以升序对数组元素进行排序。我对compare() function 感到困惑,它如何帮助实现升序排序。任何人都可以用一种简单的语言解释所涉及的原理吗?谢谢!

附: 注意cmpfunc in qsort() function in c

这里已经提出了类似的问题

【问题讨论】:

  • 它用于确定一个元素是否必须在另一个元素之前或之后。我真的不明白问题是什么。
  • 你不应该使用qsort。请改用std::sort。另请参阅 this 了解如何自定义它。
  • @NathanOliver:我正在从事 Arduino 项目。请问这个功能是否适用于Arduino?
  • 很遗憾没有。您必须移植其中一个开源标准库才能使用它。可惜他们的库支持如此不完整。

标签: c++


【解决方案1】:

它没有魔法。原型是:

int compare (const void *a, const void *b)

指针ab指向 被排序数组中相邻元素的指针。 compare 函数的作用是告诉qsort 如何评估a 指向的值是否在b 指向的值之前排序(在这种情况下,比较函数应该返回-1)。如果值相等,那么它应该返回0,最后如果b 应该排在a 之前,比较应该返回1

(技术上可以返回任何负值或正值)

但是,您的compare 可能会溢出。最好测试整数值作为两个条件表达式的结果,例如

/* integer comparison ascending
 * (adapt for all numeric types)
 */
int compare (const void *a, const void *b)
{
    /* (a > b) - (a < b) */
    return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b);
}

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 2018-03-26
    • 2010-09-24
    • 2018-09-14
    • 1970-01-01
    • 2021-10-01
    • 2021-08-04
    相关资源
    最近更新 更多