проблема быстрой сортировки - PullRequest
2 голосов
/ 11 июня 2010

Я использую qsort из библиотеки C и у меня есть тип данных

Element_type **pElement and Element_type is struct typedef element_type {int ,char ....} 

пример, и я вызываю функцию quicksor с

qsort(*pElement,iCountElement,(size_t)sizeof(Element_type),compare);

и функция обратного вызова

static int compare(const void *p1, const void *p2) {
    Element_type  *a1 = (Element_type  *)p1;
    Element_type *a2 =  (Element_type   *)p2;
    return ( (a2)->iServiceId < (a1)->iServiceId );
}

но я всегда получаю ошибку сегментации. Почему?

Ответы [ 4 ]

3 голосов
/ 11 июня 2010

Ваша функция сравнения должна возвращать, считается ли elem1 меньше, равно или больше, чем elem2, возвращая, соответственно, отрицательное значение, ноль или положительное значение.

Также, если вы хотите выполнить сортировку дляНапример, массив Element_Type, тогда вы приведете void* к типу Element_Type*.Если ваши элементы, которые вы пытаетесь отсортировать, равны Element_Type*, то вы должны привести void * к Element_Type**.

Если элементы, которые вы пытаетесь отсортировать, имеют тип Element_Type*, убедитесь, что вывыделяя память для каждого из этих элементов и затем инициализируя для каждого элемента перед вызовом qsort.

1 голос
/ 11 июня 2010
   pElement = (Element_type *)malloc(sizeof(Element_type )* iiNewSize);

Вы должны вызывать qsort (pElement, ...), а не qsort (* pElement, ...). Объявление pElement в верхней части вашего сообщения не может быть точным.

0 голосов
/ 11 июня 2010

Это самый простой способ исправить функцию сравнения:

 static int compare(const void *p1, const void *p2) {
    Element_type  *a1 = (Element_type  *)p1;
    Element_type *a2 =  (Element_type   *)p2;
-   return ((a2)->iServiceId < (a1)->iServiceId );
+   return (a1->iServiceId) - (a2->iServiceId);
 }

Я не могу прочитать первый сегмент кода, поэтому не буду выдвигать предложения относительно вашего сегфоута.

0 голосов
/ 11 июня 2010
static int compare(const void *p1, const void *p2) {
    Element_type  *a1 = *(Element_type  *)p1;
    Element_type *a2 =  *(Element_type   *)p2;

    if( (a1)->iServiceId < (a2)->iServiceId )
    {
        return -1; // this means that a1 < a2 in your criteria
    }

    if( (a1)->iServiceId == (a2)->iServiceId )
    {
        return 0; // this means that a1 == a2 in your criteria
    }

    return 1; // this means that a1 > a2 in your criteria
}

Вызовите qsort следующим образом:

qsort(pElement,iCountElement,(size_t)sizeof(Element_type),compare);

ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: дайте нам фрагмент кода, чтобы мы могли видеть больше проблем, если это так

...