0

尝试比较排序算法的空隙。到目前为止我有这个,但如果你把它们转换成整数,它有点违背了 IMO 的目的。有没有办法比较空洞?我的教授没时间了,怎么被困在网上。任何帮助表示赞赏。谢谢

int fcmp(const void *one, const void *two)
{
    if (*(int*)one > *(int*)two) return 1;
    if (*(int*)one < *(int*)two) return -1;
    return 0;
}
4

3 回答 3

2

假设这个想法是fcmp在 的上下文中使用qsort,那么您的代码是完全有效的。

由于qsort不关心返回值是1or-1并且会采用任何正数或负数,因此此版本甚至更短,但也可以使用qsort

int fcmp (const void * one, const void * two)
{
    return ( *(int*)one - *(int*)two );
}

qsort使用的原因void*是让您对不同的数据类型使用相同的算法。

于 2012-10-24T02:43:30.063 回答
2

您不是在比较此代码中的“空白”。代码将void指针转换为int指针,然后取消引用结果,这意味着您正在比较int指针指向的 s。理想情况下,函数应该是这样编写的:

int fcmp(const int *one, const int *two)
{
    if (*one > *two) return 1;
    if (*one < *two) return -1;
    return 0;
}

但它不是这样写的,因为fcmp()在这种情况下需要有一个特定的签名。否则它不能以通用方式使用。例如,作为对另一个函数的回调。

于 2012-10-24T02:45:35.637 回答
1

这看起来是在几个标准库函数(如 qsort() )中使用的标准比较函数,您可以在其中使用某种数据项数组以及指示两个元素是否相等的比较函数调用该函数不是,如果不是,他们的整理顺序是什么。

所以 void 指针指向什么取决于程序员。这就是在比较函数接口中使用 void 指针的目的,因为调用比较函数的函数,例如 qsort(),只是想知道两个数组元素以什么顺序进入。它不知道什么是数组元素是或如何进行比较,它只知道数组的起始地址和每个元素的大小以及有多少元素。

标准库中的另一个函数是bsearch() 函数

因此,要使用它,您可能有如下代码:请参阅qsort() 手册页

typedef struct {
   int iValue;
   char  sName[10];
} DataValue;

// compare two elements of the array and indicate which one is higher
// or lower in collating sequence or if they are equal.
int dataComp (void *one, void *two)
{
    return ((DataValue *)one)->iValue - ((DataValue *)two)->iValue;
}

int main (int argc, char *argv[])
{
    DataValue myData[25];
   //.. put some data stuff in the array.
   // call qsort with the array.  specify number of elements and size of each one
   qsort (myData, sizeof(myData)/sizeof(myData[0]), sizeof(myData[0]), dataComp);
}
于 2012-10-24T02:44:45.887 回答