От http://www.geeksforgeeks.org/merge-sort-for-linked-list/Является ли сортировка связанного списка с использованием Quicksort по-настоящему медленнее, чем Mergesort из-за отсутствия произвольного доступа в Linked List?
Медленная производительность случайного доступа связанного списка делает некоторые другие алгоритмы (например, сортировки) малоэффективных, а другие (такие как пирамидальной сортировки) совершенно невозможно.
Однако я не вижу, почему быстрая сортировка будет выполняться хуже, чем сортировка слияния при сортировке связанного списка.
В быстрой сортировке:
Выбор шарнира требует произвольного доступа, и должен перебирать связанный список (O (N) на рекурсию).
Разметка может быть сделано с помощью левой направо способ развертки (который не требует произвольного доступа):
В Merge Sort:
Split в середине требует произвольного доступа и потребности для итерации по связанному списку (с использованием механизма быстрого замедления) (O (n) для каждой рекурсии).
Слияние может осуществляться с помощью поворота влево-вправо (что не требует произвольного доступа).
Так как, насколько я могу судить, как для быстрого сортировки, так и для сортировки слияния требуется произвольный доступ в каждой рекурсии, и я не понимаю, почему Quick Sort будет работать хуже, чем Merge Sort из-за неслучайного доступа к Linked List ,
Я что-то упустил?
РЕДАКТИРОВАТЬ: Я смотрю на функцию перегородки, где pivot является последним элементом, и мы последовательно переходим от lwft. Если раздел работает по-разному (т. Е. Ось находится в середине и вы поддерживаете два указателя на каждом конце), он все равно будет работать нормально, если связанный список дважды связан ...
Я видел ответы на этот вопрос. Но все эти ответы предполагают, что метод разделения работает, перемещая указатели на каждом конце, а pibot находится посередине.Используя другой метод разделения (где pivot всегда находится в конце и последовательно сравнивается с слева на righy), все проблемы случайного доступа больше не применяются – SHH
Вы можете сделать сортировку слияния в нескольких (log n) проходах, где каждый pass объединяет уже отсортированные чередующиеся подпоследовательности из предыдущего прохода. Если каждый проход строит * два * связанных списка, один для нечетных подпоследовательностей и один для четного, вам не нужно ничего делать, кроме главы каждого списка. Я чувствую, что сортировка слияния * идеально * для связанных списков. –
Я не понимаю, почему кто-то сортирует любую структуру данных, которая не поддерживается массивом. Преобразование списка в массив, сортировка его, а затем его преобразование, побьет штаны любой техники на месте. – EJP