Quicksort медленнее, чем Сортировка с объединением?

это работает для меня

compileSdkVersion 25
buildToolsVersion '25.0.0'
20
задан DShook 31 January 2009 в 00:55
поделиться

13 ответов

Я на самом деле просто записал "связанному списку сравнительную демонстрационную программу вида" в C и пришел к подобному выводу (что сортировка с объединением разобьет quicksort для большей части использования), altho мне сказали, что quicksort обычно не используется для связанных списков так или иначе. Я отметил бы, что выбором значений центра является фактор монстра - моя начальная версия использовала случайный узел в качестве центра, и когда я совершенствовал его немного для взятия среднего из двух (случайных) узлов, exectution время для 1 000 000 записей перешло из-за 4 минут меньше чем к 10 секундам, исправив его наравне с сортировкой с объединением.

Сортировка с объединением и quicksort имеют тот же большой O лучший случай (n*log (n)) и несмотря на то, чего люди могут попытаться требовать, большой O действительно об итеративном количестве и не количестве сравнения. самое большое различие , который может быть произведен между двумя из них, всегда будет к вреду quicksort, и это включает списки, которые уже в основном отсортированы или содержат большое количество связей (когда quicksort добьется большего успеха, чем сортировка с объединением, разница не будет почти настолько большой). Это вызвано тем, что связи или уже отсортировали направление потока сегментов прямо через сортировку с объединением; то, когда два списка разделения возвращаются, чтобы быть объединенными, если один список уже будет содержать все меньшие значения, то все значения слева будут сравнены по одному с первым элементом права, и затем (так как возвращенные списки имеют внутренний порядок), не далее сравнения , потребность быть сделанной и право просто , выполнило итерации на конец. Это должно сказать, количество повторений останется постоянным, но количество сравнений сокращается в половине. Если Вы говорите о фактическом времени и сортируете строки, это - сравнения, которые являются дорогими.

Связи и уже отсортированные сегменты в quicksort могут легко привести к несбалансированным спискам, если значение центра тщательно не определяется, и несбалансированные списки (например, один справа, десять слева) - то, что вызывает замедление. Так, если можно заставить quicksort работать также в уже отсортированном списке, как он делает в рандомизированном списке, у Вас есть хороший метод для нахождения центра.

, Если Вам интересно, демонстрационная программа производит вывод как это:

[root~/C] ./a.out -1 3 
Using "", 0 records
Primary Criteria offset=128

Command (h for help, Q to quit): N
How many records? 4000000
New list is 562500.00 kb

Command (h for help, Q to quit): m

Mergesorting..............3999999 function calls
123539969 Iterations     Comparison calls: 82696100
Elapsed time: 0 min 9 sec


Command (h for help, Q to quit): S
Shuffled.

Command (h for help, Q to quit): q

Quicksorting..............4000000 function calls
190179315 Iterations     Comparison calls: 100817020
Elapsed time: 0 min 23 sec

Altho без сумасшедших цветов. Существует еще некоторый материал об этом мной примерно на полпути вниз этот PS страницы .

, никакой вид не требует дополнительной памяти со связанным списком.

10
ответ дан 30 November 2019 в 00:35
поделиться

Для хорошей производительности quicksort важно не рекурсивно вызвать полностью вниз к спискам длины 1

, необходимо рассмотреть списки сортировки 2, 3 и даже 4 как вложенная IFS, подкачивающая при необходимости. Сообщите нам, как производительность изменяется.

0
ответ дан 30 November 2019 в 00:35
поделиться

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

0
ответ дан 30 November 2019 в 00:35
поделиться

Вы были достаточно случайными наборами данных? Они были частично отсортированы?

, Который мог бы влиять на скорость вида...

Как для раздела QuickSort (), Вы пропустили бы вперед, если числа находятся в отсортированном порядке, пока Вы не находите тот, который это не.

0
ответ дан 30 November 2019 в 00:35
поделиться

Это согласовывается с анализом алгоритмов. Сортировке с объединением гарантируют O (nlogn) для любого входа и для каждого времени выполнения. Quicksort является лучшим случаем O (nlogn) и средним случаем O (nlogn), но худший случай O (n^2), таким образом, среднее выполнение будет промежуточным O (nlogn) и O (n^2).

Quicksort является лучшим алгоритмом общего случая, потому что он имеет низко наверху, таким образом, он имеет хорошую скорость для значений n приблизительно до приблизительно 10000 и все еще хорошего времени выполнения для произвольно астрономических значений n. Сортировка с объединением имеет неудачные издержки записи стекового фрейма, требуемого каждым рекурсивным вызовом. Таким образом для низких значений n это имеет ужасно высокий c в RT = cnlogn, и это не предпочтительный общий метод сортировки.

Редактирование: Обезьяна программного обеспечения указала на противоречие: средние числа Quicksort O (nlogn) для случайного входа, но O (n^2) худший случай. Таким образом, это на самом деле несколько связывается энтропией Ваших данных - или Вы могли выбрать центр случайным образом. Я мог бы все еще быть прочь немного все же.

1
ответ дан 30 November 2019 в 00:35
поделиться

При реализации пирамидальной сортировки как алгоритма сортировки основы в быстрых сортировках худший вариант развития событий Вы достигаете теты (n, регистрируют n), алгоритм.

, Если бы Вам не нужна стабильная сортировка, и не сортировать связанный список, я думаю, что это было бы самым быстрым, Вы могли пойти.

Сортировка слиянием

1
ответ дан 30 November 2019 в 00:35
поделиться

Я мог предположить, что путем прямого доступа к памяти, использования C, например, можно улучшить производительность Quicksort больше, чем это возможно с Сортировкой с объединением.

Другая причина состоит в том, что для Сортировки с объединением нужно больше памяти, потому что трудно реализовать его как оперативный вид.

И специально для Вашей реализации Вы могли улучшить выбор центра, существует много различных алгоритмов для нахождения хорошего центра.

Как видно на Википедию , можно реализовать Quicksort по-разному.

1
ответ дан 30 November 2019 в 00:35
поделиться

Худший случай сортировки слиянием является средним случаем quicksort, поэтому если у Вас нет хорошей реализации, сортировка слиянием будет быстрее в целом. Получение quicksort для работы быстро о предотвращении случаев ниже среднего. Выберите лучший центр (median-3 помогает), и Вы будете видеть различие.

2
ответ дан 30 November 2019 в 00:35
поделиться

На основе этой Википедии статья ожидаются Ваши результаты.

2
ответ дан 30 November 2019 в 00:35
поделиться

Одним из преимуществ quicksort для относительно небольших размеров массива является просто артефакт аппаратной реализации.

На массивах, quicksort может быть сделан оперативный, означая, что Вы читаете из и пишете в ту же область памяти. Сортировка с объединением, с другой стороны, обычно требует выделяющих новых буферов, означая, что Ваш доступ к памяти более распространен. Вы видите оба из этих поведений в Ваших реализациях в качестве примера.

В результате для относительно небольших наборов данных, quicksort, более вероятно, получит удачные обращения в кэш и поэтому просто имеет тенденцию работать быстрее на большинстве аппаратных средств.

Сортировка с объединением является все еще довольно хорошим решением для больших наборов данных или других структур данных, как связанные списки, как Ваши эксперименты подтверждают.

3
ответ дан 30 November 2019 в 00:35
поделиться
3
ответ дан 30 November 2019 в 00:35
поделиться

(1) существует qsort алгоритм, используемый C qsort (), который не требует дополнительной памяти. Это было по всей вероятности изобретено Hoare. Это делает qsort () быстро в C.

(2) Рандомизация данных прежде, чем выполнить qsort будет почти всегда ускорять его.

(3) выбор средних данных для центра может сделать его быстрее,

1
ответ дан 30 November 2019 в 00:35
поделиться

Сортировка слиянием намного медленнее для данных на основе случайных массивов, если они умещаются в оперативной памяти. Я впервые вижу, что это обсуждается.

  • qsort сначала самый короткий подмассив.
  • переключиться на сортировку вставкой ниже 5-25 элементов
  • выполнить обычный выбор поворота

Ваш qsort очень медленный, потому что он пытается разбить и отсортировать массивы длины 2 и 3.

4
ответ дан 30 November 2019 в 00:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: