qsort
означает «Quick Sort», что является быстрым, но нестабильным алгоритмом сортировки. Предположим, что вы сортируете по возрастанию. В этом случае алгоритм сортировки называется стабильным, если он не будет заменять элементы, имеющие одинаковые ключи. Если он может менять элементы с одинаковыми клавишами, это нестабильно.
Существуют различные решения вашей проблемы; Я предложу двух из них здесь.
Решение 1
Вы можете найти в Википедии некоторые интересные идеи относительно stability of sorting algorithms, в том числе способ применения нестабильных алгоритмов, когда вы на самом деле нужно стабильное один: вы расширить сортировки ключевых: если вы например, сортировка с использованием целочисленного значения.
Предположим, что вы сортируете массив целых чисел. Вместо этого вы создаете структуру с двумя элементами: первая (KEY
) является вашим целым числом.Второй (AUX_KEY
) является уникальным номером. Перед сортировкой вы линейно устанавливаете AUX_KEY
, чтобы отразить первоначальный заказ. При сортировке перейдите к qsort
функции, которая будет сортироваться с использованием KEY
, но вернется к использованию AUX_KEY
, если два ключа равны.
Решение 2
Вместо использования Quicksort используйте устойчивый алгоритм, как merge sort, который вы, вероятно, имеете в среде программирования (например, вот FreeBSD manpage for mergesort, то же самое может быть доступна в других средах программирования под одно и то же имя - пожалуйста, проверьте), или, если вам не нужна слишком большая скорость, используйте insertion sort (который вы можете запрограммировать самостоятельно - это занимает несколько строк только в псевдокоде). Взятие сортировки вставки имеет квадратичную временную сложность (требуется время, пропорциональное n^2), тогда как mergesort и quicksort имеют временную сложность O (n log (n)).
Желательное мышление не помогает. Либо вы принимаете ограничение, либо пишете свой собственный код. – Olaf
Я ценю это, я просто хотел проверить, что сначала не было простого известного решения моей проблемы. –