Мы видели в классе, как алгоритм сортировки выбором работает со структурой данных массива. В этой лабораторной работе мы попрактикуемся в том, как можно выполнить сортировку выбором для АТД со связанными списками. 1. Преобразуйте следующий псевдокод сортировки выбором, чтобы выполнить сортировку в порядке возрастания. (функция selectionSort_asc) а. Найдите узел с минимальным значением в связном списке длины n b. Добавить узел min в новый связанный список результатов c. Удалить min из исходного связанного списка d. Повторяйте шаги a-c, пока исходный связанный список не станет пустым e. Вернуть связанный список результатов 2. Преобразовать следующий псевдокод сортировки выбором, чтобы выполнить сортировку в порядке убывания. (функция selectionSort_desc) а. Найдите узел с максимальным значением в связном списке длины n b. Добавить максимальный узел в новый связанный список результатов c. Удалить макс. из исходного связанного списка d. Повторяйте шаги a-c, пока исходный связанный список не станет пустым e. Вернуть связанный список результатов
Я попробовал этот код ниже, но он не дает мне правильного вывода.
public class Sort {
public static void main(String[] args){
Node head = initializeList("ilovedata");
System.out.println("\n List Before selectionSort_asc");
printList(head);
head = selectionSort_asc(head);
System.out.println("\n List After selectionSort_asc");
printList(head);
// Expected answer: -> a -> a -> d -> e -> i -> l -> o -> t -> v
head = initializeList("ilovedata");
System.out.println("\n List Before selectionSort_desc");
printList(head);
head = selectionSort_desc(head);
System.out.println("\n List After selectionSort_desc");
printList(head);
// Expected answer: -> v -> t -> o -> l -> i -> e -> d -> a -> a
}
public static Node selectionSort_asc(Node head){
Node result = null;
Node curr, prev, min;
while(head!=null) {
curr = head;
prev = null;
min = head;
while(curr.next!=null) {
curr = curr.next;
if(curr.item<min.item) {
prev = min;
min = curr;
}
}
//append the min at the end of result list
Node add_min = new Node(min.item);
if(result==null)
result = add_min;
else {
Node last = result;
while(last.next!=null) {
last = last.next;
}
last.next = add_min;
}
//delete the min node form original list
if(min==head) {
head = head.next;
}
else if(min.next==null){
prev.next = null;
}else {
prev.next = prev.next.next;
min.next = null;
}
}
return result;
}
public static Node selectionSort_desc(Node head){
Node result = null;
Node curr, prev, max;
while(head!=null) {
curr = head;
prev = null;
max = head;
//find out the max node
while(curr.next!=null) {
curr = curr.next;
if(curr.item>max.item) {
prev = max;
max = curr;
}
}
//add max to the end of result list
Node add_max = new Node(max.item);
if(result==null) {
result = add_max;
}
else {
Node last = result;
while(last.next!=null) {
last = last.next;
}
last.next = add_max;
}
//delete min from original list
if(max == head) {
head = head.next;
}
else if(max.next==null){
prev.next = null;
}
else {
prev.next = max.next;
max.next = null;
}
}
return result;
}
// Method that takes a string and insert its characters into a linked list
public static Node initializeList(String str){
Node head= new Node(str.charAt(0)),cur;
int i;
for(cur= head,i=1;i<str.length();i++,cur=cur.next){
cur.next = new Node(str.charAt(i));
}
return head;
}
// Method for printing linked list
public static void printList(Node head){
Node cur = head;
if(head==null)
System.out.print("<EMPTY>");
for(;cur!=null;cur=cur.next){
System.out.print("-> "+cur.item+" ");
}
}
}