0

如果我有一个排序算法,并且我想按结构的某个字段进行排序。我基本上是在寻找一个参数(sortBy在这种情况下)能够确定是否将比较 fieldOne 或 fieldTwo 的可能性——而无需不断检查要使用的正确字段。

void func(SomeType *arr, int length, int sortBy) {
    int i;
    for(int i = 0; i < length, i++) {
        if(sortBy == 1) {
            doSomethingTo(arr[i].fieldOne);
        }
        else if(sortBy == 2) {
            doSomethingTo(arr[i].fieldTwo);
        }
        // etc
    }
}
4

2 回答 2

1

是的。有一个解决方案:

void sampleDoSomethingFunction(SomeType *arg) {
}

void func(SomeType *arr, int length, void (*doSomething)(SomeType *arg)) {
    int i;
    for(int i = 0; i < length, i++) {
        doSomething(&arr[i]);
    }
}

然后你像这样调用函数:

    func(arr,length, sampleDosomethingFunction);
于 2012-10-21T04:36:20.863 回答
1

您可以观察标准 C 的qsort()作用。它使用比较器函数对任何类型的任何数组进行排序:

void qsort(void *base, size_t nel, size_t width,
           int (*compar)(const void *v1, const void *v2));

如果应该在之前排序,比较器函数返回负值,如果v1应该在v2之后排序,则返回正值,如果在此排序条件下值相等,则返回零。请注意,有必要比较两个值;将一个值与其自己的肚脐进行比较是不够的。

在您的示例中,您似乎正在对固定类型进行排序。您可以使用qsort(),或者您可以借用比较器类型的想法,并使其适应您的排序:

void func(SomeType *arr, int length, int (*comparator)(const SomeType *v1, const SomeType *v2))
{
    ...
    int cmp = comparator(&arr[i], &arr[j]);
    ...
}

您的比较器可能是:

static int compare_fieldOne(const SomeType *v1, const SomeType *v2)
{
    if (v1->fieldOne < v2->fieldOne)
        return -1;
    else if (v1->fieldOne > v2->fieldOne)
        return +1;
    return 0;
}

如果你需要做更多的比较,你可以在else if子句之后添加额外的测试对,将相等的情况留到最后。

于 2012-10-21T04:38:56.370 回答