быстрая сортировка в C ++ выполняется медленно
Вопрос
У меня есть 9 значений в виде матрицы, и мне нужно вычислить медиану по этим значениям как часть процесса моделирования.
Я использую быструю сортировку в C ++ (т.е. qsort()), что приводит к замедлению процесса (поскольку этот процесс повторяется несколько раз).
Есть ли лучший алгоритм сортировки, который я мог бы использовать?
Решение
Сортировка по медиане очень неэффективна. Вместо этого вы можете использовать STL nth_element:
#include <algorithm>
// Assuming you keep the elements in a vector v of size len
std::nth_element( v.begin(), v.begin()+len/2, v.end() );
median = v[len/2];
//... or, if the elements are in a simple array v[len], then
std::nth_element( v, v+len/2, v+len );
median = v[len/2];
Примечание: элемент nth_element изменит вектор / массив v. Сначала сделайте копию, если вам нужно сохранить оригинал.
Другие советы
Пожалуйста, пожалуйста, никогда не рекомендуйте пузырьковую сортировку, кроме мазохистов!
Для небольших значений лучше всего использовать вставку и другие приложения (почти отсортированные данные любой длины).
Редактировать: исправлено форматирование, подчеркивая предложенный ответ.
Всего 9 значений?Быстрая сортировка - это перебор.
Возможно, используйте сортировку по вставке, пузырьковую сортировку или другие более простые алгоритмы сортировки при работе с небольшими наборами данных.
Производительность
Пузырьковая сортировка имеет как наихудшую, так и среднюю сложность О(n2), где n - количество сортируемых элементов.Существует множество алгоритмов сортировки с существенно лучшей сложностью для наихудшего случая или средней сложности O (n log n).Даже другие алгоритмы сортировки О (n2), такие как сортировка по вставке, как правило, имеют лучшую производительность, чем сортировка пузырьками.Следовательно, пузырьковая сортировка не является практичным алгоритмом сортировки, когда n велико.
Однако, конечно, вам даже не нужно было сортировать, чтобы получить медиану, как предлагали другие.
Как уже упоминалось, нет необходимости полностью сортировать, чтобы получить медиану.
STL имеет алгоритм сортировки , который обычно может выполнять сравнение на вставке. Он также имеет более умный алгоритм, чем гарантировано qsort, с наихудшим значением O (NlgN).
Использование быстрой сортировки только для 9 значений будет довольно неэффективным. Для такого небольшого размера выборки вам гораздо лучше использовать сортировку выбора или замену сортировки ... в этих методах сортировки очень мало затрат.
Quicksort и Mergesort действительно светятся, когда размер выборки достигает порогового значения, возможно, 50+. Р>
В этих ситуациях я бы написал собственный код, а не использовал бы встроенную функцию.
Алгоритм std :: sort () почти всегда предпочтительнее qsort (). Обычно он проще в использовании и работает быстрее.
Если вы хотите вникнуть в подробности, на самом деле есть семейство алгоритмов сортировки. Страуструп пишет на языке программирования C ++ , что std :: sort часто не совсем подходит для использования. В этом случае std :: nth_element (), вероятно, то, что вы хотите.
У вас недостаточно значений для работы с быстрой сортировкой, и вам следует использовать менее продвинутые алгоритмы (например, сортировка по пузырькам, сортировка по вставкам, ... объяснение здесь .
С настройкой Quicksort связана стоимость, и когда у вас недостаточно значений, использовать этого зверя бесполезно.
Вставка сортировки.
В небольших наборах данных вы можете использовать разные алгоритмы для достижения оптимальной производительности. Быстрая сортировка светит, когда набор данных увеличивается. Р>
Есть разные подходы. Вы можете использовать структуры данных, где вы сортируете при вставке, и есть места, где вы сортируете полный набор данных. Вам просто нужно найти оптимальный алгоритм. Р>