это работает для меня
compileSdkVersion 25
buildToolsVersion '25.0.0'
Я на самом деле просто записал "связанному списку сравнительную демонстрационную программу вида" в 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 страницы .
, никакой вид не требует дополнительной памяти со связанным списком.
Для хорошей производительности quicksort важно не рекурсивно вызвать полностью вниз к спискам длины 1
, необходимо рассмотреть списки сортировки 2, 3 и даже 4 как вложенная IFS, подкачивающая при необходимости. Сообщите нам, как производительность изменяется.
Это могло бы зависеть от того, какие данные Вы сортируете для тестирования (уже заказанный списки, рандомизированные, инвертируйте отсортированный). Кроме того, quicksort, вероятно, будет быстрее в целом при выборе случайного центра вместо того, чтобы использовать первый элемент.
Вы были достаточно случайными наборами данных? Они были частично отсортированы?
, Который мог бы влиять на скорость вида...
Как для раздела QuickSort (), Вы пропустили бы вперед, если числа находятся в отсортированном порядке, пока Вы не находите тот, который это не.
Это согласовывается с анализом алгоритмов. Сортировке с объединением гарантируют 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) худший случай. Таким образом, это на самом деле несколько связывается энтропией Ваших данных - или Вы могли выбрать центр случайным образом. Я мог бы все еще быть прочь немного все же.
При реализации пирамидальной сортировки как алгоритма сортировки основы в быстрых сортировках худший вариант развития событий Вы достигаете теты (n, регистрируют n), алгоритм.
, Если бы Вам не нужна стабильная сортировка, и не сортировать связанный список, я думаю, что это было бы самым быстрым, Вы могли пойти.
Я мог предположить, что путем прямого доступа к памяти, использования C, например, можно улучшить производительность Quicksort больше, чем это возможно с Сортировкой с объединением.
Другая причина состоит в том, что для Сортировки с объединением нужно больше памяти, потому что трудно реализовать его как оперативный вид.
И специально для Вашей реализации Вы могли улучшить выбор центра, существует много различных алгоритмов для нахождения хорошего центра.
Как видно на Википедию , можно реализовать Quicksort по-разному.
Худший случай сортировки слиянием является средним случаем quicksort, поэтому если у Вас нет хорошей реализации, сортировка слиянием будет быстрее в целом. Получение quicksort для работы быстро о предотвращении случаев ниже среднего. Выберите лучший центр (median-3 помогает), и Вы будете видеть различие.
На основе этой Википедии статья ожидаются Ваши результаты.
Одним из преимуществ quicksort для относительно небольших размеров массива является просто артефакт аппаратной реализации.
На массивах, quicksort может быть сделан оперативный, означая, что Вы читаете из и пишете в ту же область памяти. Сортировка с объединением, с другой стороны, обычно требует выделяющих новых буферов, означая, что Ваш доступ к памяти более распространен. Вы видите оба из этих поведений в Ваших реализациях в качестве примера.
В результате для относительно небольших наборов данных, quicksort, более вероятно, получит удачные обращения в кэш и поэтому просто имеет тенденцию работать быстрее на большинстве аппаратных средств.
Сортировка с объединением является все еще довольно хорошим решением для больших наборов данных или других структур данных, как связанные списки, как Ваши эксперименты подтверждают.
Ранее обсужденный на ТАК: ", Почему quicksort лучше, чем сортировка с объединением? "
~
(1) существует qsort алгоритм, используемый C qsort (), который не требует дополнительной памяти. Это было по всей вероятности изобретено Hoare. Это делает qsort () быстро в C.
(2) Рандомизация данных прежде, чем выполнить qsort будет почти всегда ускорять его.
(3) выбор средних данных для центра может сделать его быстрее,
Сортировка слиянием намного медленнее для данных на основе случайных массивов, если они умещаются в оперативной памяти. Я впервые вижу, что это обсуждается.
Ваш qsort очень медленный, потому что он пытается разбить и отсортировать массивы длины 2 и 3.