Первый аргумент qsort
- указатель на начало сортируемого массива. Вместо
qsort(i[5], 5, sizeof(double), sort);
должно читаться
qsort(i, 5, sizeof(double), sort);
Некоторые дальнейшие наблюдения:
- Неверная длина инициализатора
i
(i
имеет пять элементов, а инициализатор - шесть).
- Жесткое кодирование 5 в
qsort
вызовет проблемы позже.
- Имя "
i
" чаще всего используется для счетчиков циклов и т. П.
- Вызов функции сравнения
sort
сбивает с толку.
- Ваша функция сравнения неверна. Подумайте, как бы вы сравнили числа
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; Я оставляю читателю это упражнение, чтобы исправить это.