Qsort и Comparators странное поведение. С

Итак, я использую qsort в своей программе на C из библиотеки C. Он работает так, как ожидалось, поэтому я решил поиграть со компараторами.

Компаратор 1 (я использую это):

 int compare (const void * a, const void * b)
{
  if (*(double*)a > *(double*)b) return 1;
  else if (*(double*)a < *(double*)b) return -1;
  else return 0;  
}

Компаратор 2:

int comp (const void *a, const void *b)
{
    const double *ia = (const double *)a; // casting pointer types 
    const double *ib = (const double *)b;
    return *ia  - *ib; 
}

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

Я уверен, что использовал компаратор # 2 на меньших массивах, и он сработал. Если я там что-то не хватает.

+4
источник поделиться
1 ответ

Второй должен сделать тот же самый первый.

На первый взгляд он должен, но при ближайшем рассмотрении выясняется, что он не должен.

Рассмотрим, например, сравнение 5.3 и 4.9. Ясно, что первое число больше второго; однако, вычитая один из другого, вы получите 0.4, который округляется до нуля при преобразовании в int, сообщая qsort, что 5.3 и 4.9 равны друг другу.

Вы хотите применить функцию signum к разности двух аргументов. К сожалению, стандарт C не определяет один; см. этот Q & A для нескольких хороших обходов.

+7
источник

Посмотрите другие вопросы по меткам или Задайте вопрос