写出以单链表为存储结构的一组数据的简单选择排序算法。
时间: 2024-03-03 07:51:03 浏览: 16
以下是以单链表为存储结构的一组数据的简单选择排序算法实现:
```c
void SelectionSort(LinkList L) {
LNode *p, *q, *min;
int temp;
for (p = L; p != NULL; p = p->next) {
min = p;
for (q = p->next; q != NULL; q = q->next) {
if (q->data < min->data) {
min = q;
}
}
if (min != p) {
temp = p->data;
p->data = min->data;
min->data = temp;
}
}
}
```
算法分析:
1. 从链表头节点开始,设当前节点为p,设一个最小值节点min为p;
2. 从p的下一个节点开始遍历,设当前节点为q,如果q的值比min的值小,则更新min为q;
3. 遍历完链表后,如果min不等于p,交换p和min节点的值;
4. 将p指向下一个节点,重复2~3步,直到p指向链表尾部。
时间复杂度为$O(n^2)$,空间复杂度为$O(1)$。
相关问题
写出以单链表为存储结构的一组数 据的简单选择排序算法。
好的,以下是以单链表为存储结构的简单选择排序算法的实现过程:
1. 定义一个链表节点结构体,包含数据域和指向下一节点的指针域。
```
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
```
2. 定义一个选择排序函数,输入参数为链表头指针,返回值为排序后的链表头指针。具体实现过程如下:
```
ListNode* selectionSortList(ListNode* head) {
if (!head || !head->next) return head; // 特判链表为空或只有一个节点的情况
ListNode *dummy = new ListNode(0); // 定义一个虚拟头节点
dummy->next = head;
ListNode *cur = head;
while (cur->next) { // 循环遍历链表
ListNode *minNode = cur, *pre = dummy;
while (cur->next) { // 找到当前未排序部分的最小值节点以及其前一个节点
if (cur->next->val < minNode->val) {
minNode = cur->next;
pre = cur;
}
cur = cur->next;
}
if (minNode != cur) { // 如果最小值节点不是当前节点,交换它们的位置
pre->next = minNode->next;
minNode->next = cur->next;
cur->next = minNode;
}
cur = pre->next;
}
return dummy->next;
}
```
3. 调用选择排序函数进行排序,示例代码如下:
```
ListNode* head = new ListNode(3);
head->next = new ListNode(1);
head->next->next = new ListNode(4);
head->next->next->next = new ListNode(2);
head = selectionSortList(head);
while (head) {
cout << head->val << " ";
head = head->next;
}
```
输出结果为:1 2 3 4。
以上就是以单链表为存储结构的简单选择排序算法的实现过程。
以单链表为存储结构的一组数据的简单选择排序算法。
简单选择排序是一种基于比较的排序算法,其基本思想是每次从未排序的元素中选择一个最小的元素,将其放到已排序的元素末尾。
对于单链表来说,简单选择排序的实现过程如下:
1. 从头节点开始遍历整个单链表,设当前节点为p,最小节点为min_node,最小节点的前驱节点为pre_min_node。
2. 在遍历过程中,记录当前节点的值与min_node的值进行比较,如果当前节点的值小于min_node的值,则更新min_node为当前节点,同时更新pre_min_node为当前节点的前驱节点。
3. 遍历结束后,将min_node节点从原链表中删除,并将其插入到已排序的节点的末尾。
4. 重复1-3步骤,直到所有节点都被排序完成。
以下是基于单链表的简单选择排序的实现代码:
```python
class Node:
def __init__(self, val=None):
self.val = val
self.next = None
def simple_select_sort(head):
if not head or not head.next:
return head
dummy = Node(0) # 创建哑节点
dummy.next = head
tail = dummy
while tail.next:
p = tail.next
min_node = p
pre_min_node = tail
while p.next:
if p.next.val < min_node.val:
min_node = p.next
pre_min_node = p
p = p.next
pre_min_node.next = min_node.next
min_node.next = tail.next
tail.next = min_node
tail = min_node
return dummy.next
```
时间复杂度为O(n^2),因为需要进行n次遍历,每次遍历需要找到最小节点。空间复杂度为O(1),因为只需要常数级别的额外空间。