写出以单链表为存储结构的一组数据的简单选择排序算法。
时间: 2024-03-24 21:36:50 浏览: 23
以下是单链表存储结构的简单选择排序算法:
```c
typedef struct node {
int data;
struct node *next;
} Node, *LinkedList;
void selectionSort(LinkedList head) {
Node *p, *q, *min;
int temp;
for (p = head; p != NULL; p = p->next) {
min = p;
for (q = p->next; q != NULL; q = q->next) {
if (q->data < min->data) {
min = q;
}
}
if (p != min) {
temp = p->data;
p->data = min->data;
min->data = temp;
}
}
}
```
该算法的基本思路是,每次在未排序的部分中选出最小的元素,放到已排序部分的末尾。具体实现中,我们用两个指针p和q来扫描链表,p指向未排序部分的起始位置,q依次扫描p之后的位置,找到最小的元素,并将其与p所指向的位置交换。当p扫描到链表的末尾时,排序完成。
需要注意的是,我们在交换两个节点的数据时,只交换它们的data域,而不是整个节点。
相关问题
写出以单链表为存储结构的一组数 据的简单选择排序算法。
好的,以下是以单链表为存储结构的简单选择排序算法的实现过程:
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),因为只需要常数级别的额外空间。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)