import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @描述:单链表的选择排序
* @思路: 1. 在未排序的部分中找到最小值节点
* 2. 删除该节点(删除需要找到该节点的前一个节点,因此步骤1更改为找到最小值节点前一个节点),并将该节点连接到排好序的链表尾部
* @复杂度: 时间O(N^2) 空间O(1)
* @链接:https://www.nowcoder.com/practice/78f83c3f12d2464591ebc5a73183db35
*/
class SelectionSort {
public static Node selectionSort(Node head) {
Node tail = null; //有序部分的尾节点
Node curr = head; //未排序的头节点
Node preSmall = null; //最小节点前一个节点
Node small = null; //最小节点
while (curr != null) {
small = curr; //初始化最小值
//--在未排序的部分中找到最小值节点前一个节点
preSmall = getSmallestPreNode(curr);
//--删除该节点
if (preSmall != null) {
small = preSmall.getNext();
preSmall.setNext(small.getNext());
}
//--将该节点连接到排好序的链表尾部
if (tail == null) {
head = small; // 整个链表的最小值为头节点
} else {
tail.setNext(small);
}
tail = small;
curr = curr == small ? curr.getNext() : curr; // 未排序的头节点是否移动
}
return head;
}
private static Node getSmallestPreNode(Node head) {
Node preSmall = null;
Node small = head;
Node preCurr = head;
Node curr = head.getNext();
while (curr != null) {
if (curr.getValue() < small.getValue()) {
preSmall = preCurr;
small = curr;
}
//移动
preCurr = curr;
curr = curr.getNext();
}
return preSmall;
}
public static void main(String[] args) {
Node head = Node.createNodeList(new Integer[]{6, 4, 3, 2, 5});
head = SelectionSort.selectionSort(head);
Node.printNodeList(head);
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String n = in.readLine();
String[] items = in.readLine().split(" ");
Node head = Node.createNodeList(items);
head = SelectionSort.selectionSort(head);
Node.printNodeList(head);
}
}
class Node {
private Node next;
private int value;
public Node(int value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public static Node createNodeList(Integer[] values) {
Node head = new Node((values[0]));
Node node = head;
for (int i = 1; i < values.length; i++) {
Node newNode = new Node(values[i]);
node.next = newNode;
node = newNode;
}
return head;
}
public static Node createLoopNodeList(Integer[] values) {
Node head = new Node((values[0]));
Node node = head;
for (int i = 1; i < values.length; i++) {
Node newNode = new Node(values[i]);
node.next = newNode;
node = newNode;
}
node.setNext(head);
return head;
}
public static Node createNodeList(String[] values) {
Node head = new Node(Integer.parseInt(values[0]));
Node node = head;
for (int i = 1; i < values.length; i++) {
Node newNode = new Node(Integer.parseInt(values[i]));
node.next = newNode;
node = newNode;
}
return head;
}
public static void printNodeList(Node head) {
StringBuilder sb = new StringBuilder();
while (head != null) {
sb.append(head.getValue()).append(" ");
head = head.getNext();
}
System.out.println(sb.toString());
}
public static void printLoopNodeList(Node head) {
if (head == head.getNext()) { //只有一个节点
System.out.println(head.getValue());
} else {
StringBuilder sb = new StringBuilder();
Node last = head;
while (last.getNext() != head) {
sb.append(last.getValue()).append(" ");
last = last.getNext();
}
System.out.println(sb.toString());
}
}
}