сортировать массивы double в C - PullRequest
6 голосов
/ 09 декабря 2011

если у меня есть массив

double i[5] = {1.023, 1.22, 1.56, 2, 5, 3.331};

как мне отсортировать значения так, чтобы они выглядели так:

double i[5] = {1.023, 1.22, 1.56, 2, 3.331, 5};

Я попытался qsort () безуспешно, после нескольких примеров я придумал:

qsort(i, 5, sizeof(double), sort);

int sort(const void *x, const void *y)
{
return (*(double*)x - *(double*)y);
}

with => ошибка: несовместимый тип для аргумента 1 не сортировать массив .....

1 Ответ

13 голосов
/ 09 декабря 2011

Первый аргумент qsort - указатель на начало сортируемого массива. Вместо

qsort(i[5], 5, sizeof(double), sort);

должно читаться

qsort(i, 5, sizeof(double), sort);

Некоторые дальнейшие наблюдения:

  1. Неверная длина инициализатора i (i имеет пять элементов, а инициализатор - шесть).
  2. Жесткое кодирование 5 в qsort вызовет проблемы позже.
  3. Имя "i" чаще всего используется для счетчиков циклов и т. П.
  4. Вызов функции сравнения sort сбивает с толку.
  5. Ваша функция сравнения неверна. Подумайте, как бы вы сравнили числа 1.1 и 1.2. Также подумайте о том, что произойдет, если разница между двумя значениями не помещается в int.

Я бы переписал весь ваш пример так:

double arr[] = {1.023, 1.22, 1.56, 2, 5, 3.331};

int cmp(const void *x, const void *y)
{
  double xx = *(double*)x, yy = *(double*)y;
  if (xx < yy) return -1;
  if (xx > yy) return  1;
  return 0;
}

int main() {
  qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(arr[0]), cmp);
}

Обратите внимание, что вышеупомянутая функция сравнения по-прежнему неправильно обрабатывает NaN; Я оставляю читателю это упражнение, чтобы исправить это.

...