C массив char сравнить с массивом int - PullRequest
0 голосов
/ 19 марта 2019

Я работаю в настоящее время на месте универсальной быстрой сортировки.
Я начинаю с массива int, который генерируется случайным образом для выполнения некоторых тестов.

Спецификация quiksort:
quicksort(void *array,int numberElem,int size, cmp(void*,void*))

cmp функция сравнения.

Итак: Я вызываю функцию в моем основном как:

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

Теперь вопрос:
Как я могу сравнить 2 ячейки (реально int ячейки) моего char lArray, используя размер?

Я провел некоторое исследование и не нашел ответа. Спасибо за готовность и извините, если мой английский был немного плох.

Ответы [ 3 ]

3 голосов
/ 19 марта 2019

Quic sort вызывает вашу функцию сравнения с указателями на сравниваемые элементы.В вашей функции сравнения 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));
}
0 голосов
/ 19 марта 2019

Способ сделать это - умножить размер на индекс элемента, к которому вы обращаетесь (обратите внимание на Param1 и Param2 в сортировке вставки).Я потратил время на написание довольно длинного примера с сортировкой вставкой, а не быстрой сортировкой: общая структура универсальности типов та же, но вам, очевидно, придется применять быструю сортировку, а не сортировку выбора.

#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 голосов
/ 19 марта 2019

Я не думал менять функцию сравнения в соответствии с типом для сравнения моих элементов, но, таким образом, в какой тип преобразовать мой массив void на быстрой сортировке?Например:

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