📅  最后修改于: 2023-12-03 15:11:15.914000             🧑  作者: Mango
本文介绍了一种使用递归算法实现单链表选择排序的 C++ 程序。这个程序使用了交换节点链接的方法,优化了选择排序的时间复杂度。
选择排序是一种简单的排序算法,它的基本思想是从未排序的序列中选出最小的元素,放到已排序的序列的末尾,直到全部的元素都排序完成。递归选择排序使用递归算法实现了这个排序过程,它的时间复杂度为 $O(n^2)$。
对于单链表数据结构,选择排序的时间复杂度会更高,因为每次找到最小值需要遍历整个链表。但是,我们可以通过交换节点链接的方法优化选择排序的时间复杂度。
下面是用于单链表的递归选择排序的 C++ 程序。这个程序使用了交换节点链接的方法,它能够对单链表进行递归选择排序,并返回排序后的链表头。
#include <iostream>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* findMin(ListNode* head) {
ListNode* prev = NULL;
ListNode* p = head;
ListNode* minPrev = NULL;
ListNode* minP = head;
while (p) {
if (!minP || p->val < minP->val) {
minPrev = prev;
minP = p;
}
prev = p;
p = p->next;
}
if (minPrev) {
minPrev->next = minP->next;
}
return minP;
}
ListNode* selectionSort(ListNode* head) {
if (!head) {
return NULL;
}
ListNode* minNode = findMin(head);
minNode->next = selectionSort(head);
return minNode;
}
int main() {
ListNode* head = new ListNode(3);
head->next = new ListNode(1);
head->next->next = new ListNode(2);
head = selectionSort(head);
while (head) {
std::cout << head->val << " ";
head = head->next;
}
return 0;
}
这个程序的主要函数是 selectionSort
,它接受一个单链表头指针 head
,并返回排序后的链表头指针。
selectionSort
函数首先检查链表是否为空,如果为空则直接返回 NULL
。
接下来,它调用 findMin
函数来查找链表中的最小值节点。在 findMin
函数中,我们使用两个指针 prev
和 p
来遍历链表,同时使用两个指针 minPrev
和 minP
来保存最小值节点的前一个节点和本身。当找到比当前最小值更小的节点时,我们更新 minPrev
和 minP
并继续遍历。最后,我们将最小值节点的前一个节点的 next
指向最小值节点的 next
,从而将最小值节点从链表中移除,并返回最小值节点。如果 minPrev
为空,则说明最小值节点是链表头节点,此时我们直接返回链表头节点。
回到 selectionSort
函数,我们将找到的最小值节点的 next
指向递归排序后的链表头(即 selectionSort(head)
),然后返回最小值节点作为新的链表头。
最后,我们在 main
函数中创建一个单链表并调用 selectionSort
函数对其进行排序。排序后,我们输出链表的所有节点值。
递归选择排序是一种简单但时间复杂度较高的排序算法。当应用于单链表数据结构时,其时间复杂度会更高。但是,可以通过交换节点链接的方法来优化算法的时间复杂度。该程序演示了如何使用递归算法和交换节点链接的方法实现用于单链表的递归选择排序。