【发布时间】:2017-12-14 15:46:20
【问题描述】:
我想在 C 中使用快速排序,它的函数签名为 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)),但我的比较函数的签名是 int (*compar)(const void *, const void*, const int),第三个参数在一次调用快速排序期间保持不变。
作为说明,假设我想根据不同的范数(例如 L0、L1、L2 和 Linifinity 范数)对向量数组进行排序。它实际上是哪个规范,作为第三个参数传递给比较函数,但在调用qsort 期间保持不变。是否可以像
//Function declaration for parametric comparison
int cmp3(int* a_vec, int* b_vec, int x);
// Somewhere in main
int (*cmp2)(int, int);
cmp2 = cmp3(int*, int*, 2);//2 could mean L2 norm
能够调用类似的东西
qsort(a, 100, sizeof(a), cmp2);
我知道这行不通,但我希望它能让我知道我想要完成什么。此外,由于不同比较方式的数量太大,无法进行不同的比较函数和调用 qsort。
【问题讨论】:
-
我也想过一个全局变量,但它很难看(我需要线程安全)
-
@ForceBru 这是一个很好的答案
-
你可以只拥有多个比较函数并传入需要的一个吗?
-
您可能正在寻找
qsort_r()— 但请注意qsort_r()的 Linux 和 BSD/macOS 变体不同。
标签: c pointers function-pointers quicksort