Следующая цитата из "Сравнение с другими алгоритмами сортировки" раздел из Страница сортировки Wikipedia Сортировка
В типичных современных архитектурах эффективные реализации quicksort как правило, превосходят mergesort для сортировки массивов на основе RAM. [цитата] необходимо] С другой стороны, сортировка слияния является стабильной сортировкой и более эффективно при работе с медленными доступными последовательными средами.
Мои вопросы:
-
Почему Quicksort превосходит Mergesort, когда данные, которые нужно отсортировать, могут вписаться в память? Если все данные, необходимые для кэширования или в памяти, не будут быстрыми для доступа к Quicksort и Mergesort?
-
Почему Mergesort более эффективен при обработке медленных доступа к последовательным данным (например, с диска в случае, когда данные, которые должны быть отсортированы, не могут вписаться в память)?
-
(переход от моих комментариев ниже сюда) В массиве
arr
примитивов (данные являются последовательными) из n элементов. Пара элементов, которые нужно читать и сравнивать в MergeSort, этоarr[0]
иarr[n/2]
(происходит в конечном объединении). Теперь подумайте, что пара элементов, которые нужно читать и сравнивать в QuickSort, этоarr[1]
иarr[n]
(происходит в первом разделе, предположим, что мы поменяем случайным образом выбранный стержень с первым элементом). Мы знаем, что данные считываются в блоках и загружаются в кеш или диск в память (исправьте меня, если я ошибаюсь), разве нет ли лучшего шанса на то, что необходимые данные будут загружаться вместе в одном блоке при использовании MergeSort? Мне кажется, MergeSort всегда будет иметь верх, потому что это, вероятно, сравнение элементов, которые ближе друг к другу. Я знаю, что это False (см. График ниже), потому что QuickSort явно быстрее...... Я знаю, что MergeSort не работает и требует дополнительной памяти, и это, вероятно, замедлит работу. Кроме того, какие части я теряю в своем анализе?
изображения из Принстон CS MergeSort и слайды QuickSort
Мой мотив:
Я хочу понять эти концепции, потому что они являются одной из основных причин того, почему mergeSort предпочтительнее при сортировке LinkedList, или нет последовательных данных и quickSort предпочтительнее при сортировке массива или последовательных данных. И почему mergeSort используется для сортировки Object в Java, а quickSort используется для сортировки примитивного типа в java.
: API Java 7 фактически использует TimSort для сортировки объекта, который является гибридом MergeSort и InsertionSort. Для примитивов Double-Pivot QuickSort. Эти изменения были реализованы, начиная с Java SE 7. Это связано с устойчивостью алгоритма сортировки. Почему метод Arrays.sort Java использует два разных алгоритма сортировки для разных типов?
Edit:
Я по достоинству оценю ответ, который касается следующих аспектов:
- Я знаю, что два алгоритма сортировки различаются по количеству ходов, чтению и сравнениям. Если эти причины способствуют поведению, которое я вижу в моих ответах (я подозревал это), то подробное объяснение того, как будут выполняться шаги и процесс алгоритма сортировки, которые имеют преимущества или недостатки в поисках данных с диска или памяти, будут высоко оценены,
- Примеры приветствуются. Я лучше разбираюсь в примерах.
Примечание: если вы читаете ответ @rcgldr. ознакомьтесь с нашей беседой в чате, в ней есть много хороших объяснений и подробностей. https://chat.stackoverflow.com/rooms/161554/discussion-between-rcgldr-and-oliver-koo