В общем
Для общего обзора быстрой сортировки вам, вероятно, следует рассмотреть алгоритм быстрой сортировки в Википедии .Короче говоря, проще, если вы используете вспомогательную функцию partition
, чтобы привести свой список в состояние, когда все, что меньше, чем ваша точка вращения, находится слева от него, а все, что больше, чем точка вращения, находится справа от него.Затем вы вызываете быструю сортировку рекурсивно с обеих сторон оси.
EJP также имеет очень хорошую точку.Я не видел быстрой сортировки в связанном списке.
Давайте сделаем это в любом случае
Если бы я видел быструю сортировку со связанным списком, алгоритм был бы похож на
def qsort(head, tail)
if head == tail
return
pivot = tail
current = head
while current != pivot
if current.value < pivot.value
move/prepend current to head of the list
else
move/append current to tail of the list
current = current.next
qsort(head, pivot-1)
qsort(pivot, tail)
Это немного сложно, потому что вы должны отслеживать pivot - 1
, что не очень естественно делать с односвязным списком.Кроме того, приведенный выше алгоритм на самом деле не учитывает равные элементы.Но общая идея заключается в том, что в конечном итоге все, что меньше pivot
, находится перед ним, и все, что больше, чем после, а затем вы снова вызываете qsort
для обеих сторон.
Ваш код
Давайте разберем вашу программу с простым кейсом.
A->B->C->D
F L
Это наш старт.
SLLNode pivot = first ;
SLLNode head = pivot.succ ;
Дает нам
A->B->C->D
F H L
P
Допустим, if (head.data.compareToIgnoreCase(pivot.data)<0)
истинно для каждого элемента, учитывая текущее состояние списка.
Итак, мы вводим if
Скажите, и сделайте
pivot.succ = head.succ ;
A->C->D B->C
F L H
P
head.succ = first ;
B->A->C->D
H F L
P
first = head ;
B->A->C->D
H P L
F
Это дает нам
A->B->C->D
F H L
P
B->A->C->D
H P L
F
Если у меня есть это право, то вызов
qSort(head, last);
Должно быть вместо этого
qSort(pivot, last);
То есть вы больше не будете звонить qSort
по всему списку.Также может показаться, что вместо этого вы можете продолжать просматривать список до тех пор, пока все, что меньше, чем пивот, не окажется слева от него, перед рекурсивным вызовом qSort
.