问题描述
已知待排序初始序列用单链表存储,头指针head指向第一个结点,从这个待排序列中找出最小结点,插入head之后,用r来指示。r以前为已排序序列,r以后为未排序序列。再从未排序序列中找出最小结点插入r的后面,让r指向这个结点。反复执行这个过程,直到排好序。
输入
链表结点的个数,结点的数据
输出
排序过程以及最终结果
存储结构
链表
源代码
import java.util.Scanner;
public class LNode {
int data;
LNode next;
public LNode() {
}
public LNode(int data) {
this.data = data;
}
}
class LinkedTable{
LNode head;
int length;
//将数组转化为链表
public LinkedTable(int[] array){
head = new LNode(array[0]);
LNode pre = head;
for (int i = 1; i < array.length;i++){
LNode lNode = new LNode(array[i]);
pre.next = lNode;
pre = lNode;
}
this.length = array.length;
}
//打印链表
static void print(LNode head){
while (head!=null){
System.out.print(head.data);
if (head.next!=null){
System.out.print("——>");
}
head = head.next;
}
}
LNode directSelectSort(){
int count = this.length;
LNode r = new LNode();
r.next = head;
head = r; //head此时为空结点,head.next指向链表的第一个结点
LNode pre; //用来遍历
LNode min;
while (count-- > 1){
pre = r.next; //每次从r的下一个开始遍历
min = r.next;
while (pre.next != null){
pre = pre.next;
if (pre.data < min.data){
min = pre;
}
}
LNode Q = r; //Q为辅助变量,用来删除min结点
while (Q.next != min){
Q = Q.next;
}
Q.next = min.next; //删除完毕
min.next = r.next;
r.next = min;
r = r.next;
print(head.next);
System.out.println();
}
return head.next;
}
}
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("输入链表结点的个数\t");
int input = sc.nextInt();
int[] arr = new int[input];
System.out.println("依次输入每个结点的数据");
for (int i = 0;i < input;i++){
arr[i] = sc.nextInt();
}
LinkedTable linkedTable = new LinkedTable(arr);
LinkedTable.print(linkedTable.head);
System.out.println("\n排序:");
LNode now = linkedTable.directSelectSort();
System.out.println("排序完成后的链表为");
LinkedTable.print(now);
}
}