首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C数组字符与数组int的比较

C数组字符与数组int的比较
EN

Stack Overflow用户
提问于 2019-03-20 00:49:21
回答 3查看 80关注 0票数 0

我目前的工作是在地方通用快速排序。

我从一个int数组开始,它是随机生成的,用于执行一些测试。

quiksort的规范是:

quicksort(void *array,int numberElem,int size, cmp(void*,void*))

cmp一个比较函数。

所以:我在main中调用函数,如下所示:

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;
}

现在的问题是:

如何使用lArray比较我的字符大小的2个单元格(真正的int单元格)?

我已经做了一些研究,但没有找到答案。谢谢你的准备,如果我的英语不太好,我很抱歉。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-20 02:06:51

实现这一点的方法是将大小乘以要访问的元素的索引(注意插入排序中的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;
}
票数 0
EN

Stack Overflow用户

发布于 2019-03-20 01:00:18

Quic sort使用指向要比较的元素的指针调用compare函数。在你的比较函数cmp (或者任何你想要使用的名字)中,你首先将这些空指针转换为它们所指向的类型,在你的例子中是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));
}
票数 3
EN

Stack Overflow用户

发布于 2019-03-20 01:06:51

我没有想过要根据类型更改比较函数来比较我的元素,但因此在快速排序上转换我的void数组的类型是什么?例如:

quicksort(void *array,int numberElem,int size, cmp(void*,void*)){
**HERE** *lArray;
lArray= (**HERE***)array; 
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55246171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档