C语言链表由大到小快速排序
时间: 2023-06-30 17:13:23 浏览: 87
链表由大到小的快速排序可以通过递归实现,以下是C语言的示例代码:
```c
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* quickSortList(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
// 选择基准点
int pivot = head->val;
struct ListNode *small = NULL, *equal = NULL, *big = NULL;
struct ListNode *p = NULL, *q = NULL, *r = NULL;
p = small;
q = equal;
r = big;
// 将链表划分为三部分
while (head != NULL) {
if (head->val < pivot) {
p = head;
p = p->next;
} else if (head->val == pivot) {
q = head;
q = q->next;
} else {
r = head;
r = r->next;
}
head = head->next;
}
// 递归排序小于和大于基准点的两部分
small = quickSortList(small);
big = quickSortList(big);
// 连接三部分
if (small != NULL) {
head = small;
while (head->next != NULL) {
head = head->next;
}
head->next = equal;
} else {
small = equal;
}
q->next = big;
return small;
}
```
在上述代码中,我们首先选择链表的头结点作为基准点,然后遍历整个链表,将链表划分为比基准点小、等于和大的三部分。接着,分别对小于和大于基准点的两部分递归进行快速排序,最后将排好序的三部分连接起来即可。
时间复杂度为 O(nlogn),空间复杂度为 O(logn)。
阅读全文