C array char与array int比较

时间:2019-03-19 16:49:21

标签: c arrays char int quicksort

我目前正在就地使用通用Quicksort。
我从一个随机生成的int数组开始做一些测试。

quiksort的规格为:
quicksort(void *array,int numberElem,int size, cmp(void*,void*))

提供比较功能。

所以: 我在主程序中调用该函数,例如:

int main(void){
 int myArray= .....randomly;
 quicksort((void *)myArray,100,sizeof(int),cmp)
}

然后在我的快速排序中:

quicksort(void *array,int numberElem,int size, cmp(void*,void*)){
char *lArray;
lArray= (char*)array;
}

现在的问题是:
如何使用大小比较char lArray的2个单元格(真正的int单元格)?

我进行了一些研究,但没有找到答案。 感谢您的准备,如果我的英语不太好,抱歉。

3 个答案:

答案 0 :(得分:3)

Quic sort使用指向要比较元素的指针来调用您的compare函数。在比较函数cmp(或您要使用的其他名称)中,首先将这些void指针强制转换为它们指向的类型,在您的情况下为int。然后将它们进行比较:

int cmp(void* x1,void* x2)
{
    int *v1= (int *)x1, *v2= (int *)x2;
    return (*v1<*v2);
}

int cmp(void* x1,void* x2)
{
    return (*((int *)x1) < *((int *)x2));
}

答案 1 :(得分:0)

我没有想到要根据类型来更改比较函数以比较我的元素,但是要在quicksort上转换我的void数组的类型是什么? 例如:

quicksort(void *array,int numberElem,int size, cmp(void*,void*)){
**HERE** *lArray;
lArray= (**HERE***)array; 
}

答案 2 :(得分:0)

执行此操作的方法是将大小乘以您正在访问的元素的索引(请注意插入排序中的Param1Param2)。我花时间写了一个很长的插入排序而不是快速排序的示例:类型泛型背后的一般结构是相同的,但是显然您必须应用快速排序而不是选择排序。

#include <stdlib.h>
#include <stdio.h>

int CmpChar(void* Param1, void* Param2) {
    char  P1 = *((char*) Param1);
    char  P2 = *((char*) Param2);
    return P1 < P2;
}

int CmpShort(void* Param1, void* Param2) {
    short  P1 = *((short*) Param1);
    short  P2 = *((short*) Param2);
    return P1 < P2;
}

int CmpInt(void* Param1, void* Param2) {
    int    P1 = *((int*) Param1);
    int    P2 = *((int*) Param2);
    return P1 < P2;
}

int CmpLong(void* Param1, void* Param2) {
    long long P1 = *((long long*) Param1);
    long long P2 = *((long long*) Param2);
    return    P1 < P2;
}

void GenericInsertionSort(void* Array, int Length, int Size, int Cmp(void*, void*)) {
    char* lArray = (char*) Array;
    void* Temp = malloc(Size);
    for (int i = 0; i < (Length - 1); i++) {
        int j = i + 1;
        void* Param1 = lArray + Size*j;
        void* Param2 = lArray + Size*(j - 1);
        while (j && Cmp(Param1, Param2)) {
            memcpy(Temp, Param2, Size);
            memcpy(Param2, Param1, Size);
            memcpy(Param1, Temp, Size);
            j--;
            Param1 = ((char*) Param1 - Size);
            Param2 = ((char*) Param2 - Size);
        }
    }
}

int main(void) {
    long long   A1[] = {5, 3, 1, 4, 2};
    int         A2[] = {5, 3, 1, 4, 2};
    short       A3[] = {5, 3, 1, 4, 2};
    char        A4[] = {5, 3, 1, 4, 2};
    GenericInsertionSort(A1, 5, 8, CmpLong);
    GenericInsertionSort(A2, 5, 4, CmpInt);
    GenericInsertionSort(A3, 5, 2, CmpShort);
    GenericInsertionSort(A4, 5, 1, CmpChar);

    for (int i = 0; i < 5; i++) {
        printf("%llu == %d == %d == %d\n", A1[i], A2[i], A3[i], A4[i]);
    }
    getchar();
    return 0;
}