1

我想将任意结构指针数组和比较函数传递给通用排序算法。这在C中可能吗?

结构的goooeys只能在比较函数中访问,排序函数只需要调用比较函数和交换指针,但我不知道如何声明它。

function sorter( struct arbitrary ** Array, int Length, int cmp(struct node * a, struct node * b))
{
    for (int i=0; i<Length;i++){
        if cmp(Array[i],Array[i+1]){
            swap(Array[i],Array[i+1]
       }
    }
}
4

4 回答 4

3

您可以将函数声明为:

void sorter(void** the_array, size_t array_length, int (*comparison_function)(void*, void*));

在比较函数内部,您需要将要比较的两个指针转换为指向比较函数比较的任何结构类型的指针。

于 2009-11-01T05:30:35.360 回答
1

实际上,这个函数已经存在......它被称为qsort请参阅此处的一些文档。它也比您的实现更有效,即 O(n^2)。

于 2009-11-01T05:32:27.583 回答
0

也许您只需要传递 void 指针?

function sorter(void ** Array, int Length, int cmp(void * a, void * b))
于 2009-11-01T05:29:36.670 回答
0

在 C 中总是可能的,因为您可以将每个指针转换为void*. 但是,如果您希望能够将其转换回指向任意结构的指针,您将需要某种类型的识别。

您可以通过使用特定于类型的函数(如果您要比较的内容相同)来做到这一点,或者以某种方式将类型编码到结构中。这可以通过在结构中添加一个额外的字段或通过更改cmp()函数本身来获取类型标识符来完成。

但是您应该知道,C 已经有一个qsort()通常相当有效的函数(尽管标准中没有规定它使用什么算法 - 它可以使用冒泡排序并且仍然符合要求)。除非您正在为家庭作业实施一个,或者考虑到不同的算法,否则您可能应该只使用它。

就目前而言,您的算法看起来像冒泡排序的内部循环,因此实际上不会正确排序。冒泡排序由两个嵌套循环组成,一般只适用于小数据集或具有特定特征的数据集(例如大部分已经排序)。

于 2009-11-01T05:31:07.463 回答