快速排序、单向链表的快速排序(C++)

本文介绍了快速排序算法的基本思想,包括挖洞法和左右交换两种实现方式,并详细阐述了单向链表上如何应用快速排序,最后讨论了快速排序的平均和最坏情况下的时间复杂度。
摘要由CSDN通过智能技术生成

一、快速排序

取数组的第一个值作为基准值key,将数组中小于key的值排在key的左边,将数组中大于key的值排在key的右边,然后递归处理以key为分割的两个序列

(1)挖洞法。

a、挖洞法就是将数组Array第一个值作为基准值key保存(索引left和right分别指向序列的头和尾元素),索引right从右至左移动找到第一个小于key值的元素或者left等于right(left==right)时,将 Array[left] 值填入 Array[left] 的位置。

value 6(key) 2 4 9 7 10 3
index 0(left) 1 2 3 4 5 6(right)
value 3 2 4 9 7 10 3
index 0(left) 1 2 3 4 5 6(right)

 b、然后再从left开始,left从左向右移动找到第一个大于key值的元素或者left等于right(left==right),将该元素值赋值给 Array[right];

value 3 2 4 9 7 10 9
index 0 1 2 3(left) 4 5 6(right)

c、重复循环执行步骤a和b,直至left等于right(left==right)时结束循环,并将key赋值给 Array[left];

value 3 2 4 9->6 7 10 9
index 0 1 2
以下是单向链表快速排序的C语言实现: ```c #include <stdio.h> #include <stdlib.h> // 定义链表结构体 typedef struct Node { int value; struct Node* next; } Node; // 创建链表节点 Node* createNode(int value) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->value = value; newNode->next = NULL; return newNode; } // 将链表拆分成小于和大于pivot的两个链表 void partition(Node* head, int pivot, Node** lessHead, Node** greaterHead) { Node* lessTail = NULL; Node* greaterTail = NULL; Node* curr = head; while (curr != NULL) { Node* next = curr->next; if (curr->value < pivot) { if (*lessHead == NULL) { *lessHead = curr; lessTail = curr; lessTail->next = NULL; } else { lessTail->next = curr; lessTail = curr; lessTail->next = NULL; } } else { if (*greaterHead == NULL) { *greaterHead = curr; greaterTail = curr; greaterTail->next = NULL; } else { greaterTail->next = curr; greaterTail = curr; greaterTail->next = NULL; } } curr = next; } } // 快速排序 Node* quickSort(Node* head) { if (head == NULL || head->next == NULL) { return head; } Node* lessHead = NULL; Node* greaterHead = NULL; // 将链表拆分成小于和大于pivot的两个链表 partition(head->next, head->value, &lessHead, &greaterHead); // 递归快排小于和大于pivot的两个链表 lessHead = quickSort(lessHead); greaterHead = quickSort(greaterHead); // 将小于pivot的链表和大于pivot的链表连接起来 head->next = greaterHead; if (lessHead == NULL) { return head; } Node* curr = lessHead; while (curr->next != NULL) { curr = curr->next; } curr->next = head; return lessHead; } // 打印链表 void printList(Node* head) { while (head != NULL) { printf("%d ", head->value); head = head->next; } printf("\n"); } int main() { Node* head = createNode(5); head->next = createNode(3); head->next->next = createNode(8); head->next->next->next = createNode(4); head->next->next->next->next = createNode(2); printf("Before sorting: "); printList(head); head = quickSort(head); printf("After sorting: "); printList(head); return 0; } ``` 输出: ``` Before sorting: 5 3 8 4 2 After sorting: 2 3 4 5 8 ``` 这里的快速排序算法的时间复杂度是O(nlogn),空间复杂度是O(1),其中n是链表的长度。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值