📅  最后修改于: 2023-12-03 14:56:19.730000             🧑  作者: Mango
本程序用于对单链表进行递归选择排序。采用的数据结构是以 JavaScript 对象形式表示的单链表。
程序的实现方法是通过将节点的链接进行交换,实现对节点位置的变换。
下面是使用 JavaScript 编写的单链表递归选择排序的程序:
/**
* 节点类
*/
class Node {
constructor(value) {
this.value = value;
this.next = null;
}
}
/**
* 链表类
*/
class LinkedList {
constructor() {
this.head = null;
}
/**
* 插入节点
* @param {*} value
*/
insert(value) {
let node = new Node(value);
if (this.head === null) {
this.head = node;
} else {
let current = this.head;
while (current.next !== null) {
current = current.next;
}
current.next = node;
}
}
/**
* 单链表递归选择排序
* @param {*} head
* @returns
*/
recursiveSelectionSort(head) {
if (head === null || head.next === null) {
return head;
}
let min = head;
let beforeMin = null;
let current = head;
while (current.next !== null) {
if (current.next.value < min.value) {
min = current.next;
beforeMin = current;
}
current = current.next;
}
if (min !== head) {
beforeMin.next = head;
let temp = head.next;
head.next = min.next;
min.next = temp;
head = min;
}
head.next = this.recursiveSelectionSort(head.next);
return head;
}
/**
* 打印链表
*/
printList() {
let output = "";
let current = this.head;
while (current !== null) {
output += current.value + " -> ";
current = current.next;
}
output += "null";
console.log(output);
}
}
/**
* 测试程序
*/
let linkedList = new LinkedList();
linkedList.insert(64);
linkedList.insert(25);
linkedList.insert(12);
linkedList.insert(22);
linkedList.insert(11);
linkedList.insert(35);
console.log("排序前:");
linkedList.printList();
linkedList.head = linkedList.recursiveSelectionSort(linkedList.head);
console.log("排序后:");
linkedList.printList();
上述程序中,首先定义了两个类,即Node
和LinkedList
。其中Node
表示链表中的节点,LinkedList
表示单链表。
LinkedList
中实现了三个方法,分别是insert
、recursiveSelectionSort
和printList
。其中,insert
方法是用于插入节点的,printList
方法是用于打印链表的。
最重要的是recursiveSelectionSort
方法,这是递归选择排序的核心实现。该方法在排序过程中,采用前面说的“交换节点链接”的方法。其中,先通过while
循环找到单链表中最小的节点,然后将该节点移到链表的头部。如果需要移动,则通过对链表头部节点的链接进行交换,实现节点位置的变换。
最后通过测试程序,对单链表进行递归选择排序,并输出排序前和排序后的链表信息。