Сделать qsort стабильным, просто изменив сравнение?

Возможный дубликат:
Стабилизация стандартной библиотеки qsort?

Можно ли сделать qsort стабильным для ints, просто изменив мою операционную систему? Это мой код Я использую это на очень маленьких массивах размером около 5-7.

static int compare( const void *a, const void *b )
{
    const int A(*(const int*)(a));
    const int B(*(const int*)(b));

    return B - A;
}

3 ответа

Решение

Если вы используете C++, функция stable_sort является стабильной и имеет производительность O(nlogn).

В противном случае быстрая сортировка на месте по своей природе нестабильна (я так считаю). Однако тривиальный вариант, использующий дополнительный массив для хранения информации, стабилен.

Я использовал по крайней мере одну версию qsort() это нестабильно, потому что однажды я обнаружил, что результат, производимый qsort() а также stable_sort() для случая ввода на моей машине были разные.

Вы не можете взять нестабильный алгоритм сортировки, такой как быстрая сортировка, и сделать его стабильным, просто изменив оператор сравнения. Вы должны начать со стабильного алгоритма сортировки, и тогда сравнение не имеет значения (если это строгий слабый порядок в C++).

Если массивы, которые вы сортируете, действительно настолько малы, то вам лучше использовать другой алгоритм сортировки. См., Например, ответы на: Быстрая стабильная сортировка для маленьких массивов (до 32 или 64 элементов) и Быстрая реализация алгоритма для сортировки очень маленького списка.

Другие вопросы по тегам