Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Почему неправильно работает qsort()


Автор: AntZ 11.9.2007, 11:25
Вот код моей проги:
Код
#include <stdio.h>
#include <stdlib.h>

int mycmp(const void *a, const void *b)
{
    return *(long *)a > *(long *)b;
}

int main(int argc, char *argv[])
{
    long mas[10001], n, i;

    scanf("%li", &n);
    for (i = 0; i < n; i++)
        scanf("%li", &mas[i]);

    qsort(mas, n, sizeof(long), mycmp);

    printf("\n");
    for (i = 0; i < n; i++)
        printf("%li ", mas[i]);

    return 0;
}
Она считыает N - количество элементов, а затем считывает каждый поочереди и запоминает в массив MAS. После сортировки программа выводит все элементы массива по порядку.

Все бы ничего, но например на этих наборах данных она сортирует... НЕПРАВИЛЬНО!!! У меня уже голова трещит - не пойму.....  smile 

Вот эти входные данные  smile 
10
1
2
4
8
16
32
64
128
256
512


На выводе печатает:

32 2 4 8 16 1 64 128 256 512

Проверял дебагером, в нем было видно что после qsort(mas, n, sizeof(long), mycmp) порядок становится именно такой. Но что интересно, порядок устанавливается такой изначально, еще до первого изпользования функции mycmp(). Почему сортировка работает неправильно?

Прошу помочь всех кто может. И если причина тривиальна, то плизз не пинайте меня слишком больно...  smile 

Автор: apook 11.9.2007, 11:48
Код

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

int mycmp(const void *a, const void *b)
{
int n1=*(int*)a, n2=*(int *)b;
/*
if(n1 < n2)      
    return -1;
else if(n1 == n2)
    return 0;
else
    return 1;
*/
return( n1 < n2 ) ? -1 : ( ( n1 == n2) ? 0 : 1 );
}


int main( int argc, char *argv[] )
{
int mas[10001]={ 1,5,8,10,89,32,6,85 }, n, i;

n=10;

for( i = 0; i < n; i++ )
    printf("%li ", mas[i]);

qsort( mas, n, sizeof(int), mycmp );

printf("\n");

for( i = 0; i < n; i++ )
    printf("%li ", mas[i]);

return 0;
}

Автор: archimed7592 11.9.2007, 12:22
Цитата(apook @  11.9.2007,  11:48 Найти цитируемый пост)
return( n1 < n2 ) ? -1 : ( ( n1 == n2) ? 0 : 1 );

Аналогичный результат можно получить намного более простым выражением:
Код
return n1 - n2;

Автор: apook 11.9.2007, 12:33
Вот какая задачка в книжке А. Крупника "ИЗУЧАЕМ Cи"
Цитата

Код

Задача 7.3 Функция сравнения


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

казалось бы, выполняет ту же задачу,  Тем не менее, она ненадежна и опасна. Почему?



Автор: DjoNIK 11.9.2007, 12:58
smile 
Цитата

Вот какая задачка в книжке А. Крупника "ИЗУЧАЕМ Cи"

А нет такой же по плюсяам?

Добавлено через 1 минуту и 6 секунд
archimed7592, поздравляю 777 сообщения smile

Автор: apook 11.9.2007, 14:02
Цитата(DjoNIK @  11.9.2007,  12:58 Найти цитируемый пост)
А нет такой же по плюсяам?
 Однако есть где-то в нэте встречал, но у меня нету


Цитата(apook @  11.9.2007,  12:33 Найти цитируемый пост)
Вот какая задачка в книжке А. Крупника "ИЗУЧАЕМ Cи"Цитатакод C++1:2:3:4:5:6:7:Задача 7.3 Функция сравненияint cmp(const void *a, const void *b){ return *(int *)a - *(int *)b;}highlightSyntax('cpp_YTk4Yj','cpp');highlightSyntax('cpp_YTk4Yj','cpp');казалось бы, выполняет ту же задачу,  Тем не менее, она ненадежна и опасна. Почему?

Хотел бы я знать ответ на этот вопрос дело в том что в книжке ответ не дается тока вопрос...

Автор: AntZ 11.9.2007, 16:33
блин! smile вот я даю... все дело было в функции сравнения. что-то я стареть начал smile 
бывает вот так заклинит, а ведь сортировке надо было знать что число может быть не только меньше или больше, но и равно ли одно число другому.

 smile спасибо всем за ответ!

Цитата
Вот какая задачка в книжке А. Крупника "ИЗУЧАЕМ Cи"
Цитата

Код

Задача 7.3 Функция сравнения


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

казалось бы, выполняет ту же задачу,  Тем не менее, она ненадежна и опасна. Почему?

Может эта функция опасна, если сравниваются числа, при которых может произойти переполнение в этом типе данных...
Например, (-30000 - 30000) - при сравнении чисел -30000 и 30000, при размере типа int в 2 байта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)