如何对通用 (void*) 数组进行排序?

how to sort a generic (void*) array?

传入了一个void*类型的数组。我想对数组进行排序,但我需要能够创建一个临时值来切换数组的各个部分。我该怎么做?

所以,我通过这个使用 memcpy 切换值:

memcpy(temp, first, size);
memcpy(first, cur, size);
memcpy(cur, temp, size);

我试图在其中切换 first 和 cur 元素。 (是的,它们是指针)。这是正确的吗?因为我的程序出错了,尽管我不确定是不是因为这个。 (错误输出不准确。)

您的实现没问题,但与您的 相关,您的函数修饰应该是这样的;

编辑:“l”替换为“byteLength”

void swap(void *a, void *b, size_t byteLength) {
    void *tmp = malloc(byteLength);

    memcpy(tmp, a, byteLength);
    memcpy(a, b, byteLength);
    memcpy(b, tmp, byteLength);

    free(tmp);
    return;
}

并且,如果您要交换字符串(即 (char *) 指针);

void swap(void **a, void **b) {
    void *tmp;

    tmp = *a;
    *a = *b;
    *b = tmp;

    return;
}

...
...

{
    char *a = "some string";
    char *b = "some other string";
    ...
    ...

    // somewhere in the calling function
    swap(&a, &b);
}

它是泛型编程的核心。如果你想对一个 void* 指针数组进行排序(每个指针可以指向任何数据类型,通常是它的用户定义结构),你需要一个相等的 function/function 指针。让我们假设我们有以下结构:

typedef struct
    int foo;
    ....
    ....
    
}s_ex;

我们正在通过在堆上分配每个结构来初始化一个 s_ex 结构数组。

 void* arr[];

我们想将这个 void* 指针数组传递给排序函数,可以对任何数据类型进行排序的通用函数:

函数签名:

void gen_sort(void **user_array,int n, int(*fp_equality)(void*,void*));

唯一知道如何比较两项的是调用者(构建这些数据类型的人)!所以他需要传递一个知道如何比较两个项目的函数 fp_equality 和 return 结果作为 int(如 strcmp)。

排序的算法不是问题,你可以决定什么样的排序算法适合你的程序。为了简单起见,我采用冒泡排序:

void gen_sort(void **user_array,int n; int(*fp_equality)(void*,void*))
{
    int i, j;  
    for (i = 0; i < n-1; i++)      
      
    // Last i elements are already in place  
    for (j = 0; j < n-i-1; j++)
        if(fp_equality(arr[j],arr[j+1])>0)   /*like: (arr[j] > arr[j+1])*/    
            swap(&arr[j], &arr[j+1]);  
}  

void swap(void** lhs, void** rhs)
{
    void* temp = *lhs;
    *lhs=*rhs;
    *rhs=temp;
}