Использование быстрой сортировки в C для сортировки в обратном направлении (по убыванию)? - PullRequest
3 голосов
/ 14 ноября 2011

Для сортировки звоню qsort(myArray,100,sizeof(int), comp)

int comp(const int * a, const int * b)
if(a==b)
{
    return 0;
}
else
{
    if(a<b)
    {
        return -1;
    }
    else
    {
        return 1;
    }
}

Во-первых, Это действительно не работает, когда я сортирую массив (9,8,7,6,5,4,3,2,1,1),, я получаю (4,8,7,6,5,9,3,2,1) - НЕ действительно отсортирован.

Во-вторых, Как бы я сортировать в другом направлении? Есть ли специальный флаг для qsort, который мне нужно передать?

Ответы [ 3 ]

7 голосов
/ 14 ноября 2011

Измените функцию сравнения, чтобы она упорядочивалась так, как вам нравится.

А функция сравнения берет указатели на сравниваемые данные (а не на сами данные). Например.

int compare (const void* p1, const void* p2)
{ 
   int i1 = *(int*) p1;
   int i2 = *(int*) p2;
   if (i1 < i2) return -1;
   else if (i1 == i2) return 0;
   else return 1;
   /* or simply: return i1 - i2; */
 }
6 голосов
/ 14 ноября 2011

Вам нужно сравнивать значения, а не их адреса. Попробуйте

int comp(const int * a, const int * b)
{
 return *a - *b;
}

Чтобы отменить порядок, используйте

int comp(const int * a, const int * b)
{
 return *b - *a;
}
2 голосов
/ 14 ноября 2011

Ваш компаратор сломан.Вы сравниваете значения указателя, а не значения, на которые указывают.Добавьте оператор разыменования * в сравнения a и b, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...