Сортировка связанного списка в Java
Я написал алгоритм пузырьковой сортировки для сортировки связанного списка. Я начинающий Java и пытаюсь изучить структуры данных. Я смущен, почему мой второй элемент не отсортирован должным образом.
редактировать
class SListNode {
Object item;
SListNode next;
SListNode(Object obj) {
item = obj;
next = null;
}
SListNode(Object obj, SListNode next) {
item = obj;
this.next = next;
}
}
public class SList {
private SListNode head;
private SListNode temp;
public void sortList() {
SListNode node = head,i,j;
head = node;
i = node;
j = node.next;
while(i.next != null) {
while(j.next != null) {
if((Integer)i.item < (Integer)j.item) {
temp = i.next;
i.next = j.next;
j.next = temp;
}
j = j.next;
}
i = i.next;
}
}
}
это вывод, который я получаю
List after construction: [ 3 6 9 4 12 15 ]
After sorting: [ 3 4 9 12 6 15 ]
кроме того, я знаю, что худший сценарий пузыря - Это O (n2). Могу ли я использовать mergesort в связанном списке, чтобы лучше провести время сложность?
спасибо!
1 ответов
существует много алгоритмов сортировки, которые работают со связанными списками, и mergesort отлично работает в этом случае. Я написал более ранний ответ на вопрос о сортировке связанных списков это исследует многие классические алгоритмы сортировки в связанных списках, а также их временные и пространственные сложности. В связанных списках можно использовать сортировку вставки, сортировку выбора, mergesort и quicksort. С немного fudging, вы можете также получить работу heapsort. Моя старшая ответа подробности о том, как это сделать.
что касается вашего кода, обратите внимание, что в вашем внутреннем цикле вы продвигаетесь j
вперед до тех пор, пока next
указатель становится null
. На данный момент Вы никогда не сбрасываете j
быть чем-то еще, поэтому на каждой будущей итерации внешнего цикла внутренний цикл никогда не выполняется. Вы, вероятно, должны установить j = i.next
в начале каждой итерации. Более того, вы, вероятно, не хотите, чтобы цикл останавливался, когда j.next
равно null, но когда j
равно null, поскольку в противном случае вы пропустите последний элемент массива.
кроме того, алгоритм сортировки вы написали здесь сортировка выбор вместо сортировки пузырьков, потому что вы делаете много проходов по связанному списку, ища наименьший элемент, который вы еще не разместили. Я не знаю, является ли это проблемой или нет, но я не был уверен, знаете ли вы об этом. Тем не менее, я думаю, что это, вероятно, хорошо, так как bubble sort меньше эффективнее, чем сортировка выбора в большинстве случаев (если список уже близок к сортировке).
надеюсь, что это помогает!