用c++使用链表实现下面各种排序算法,写出完整代码并进行比较。 排序算法: 1、插入排序 2、冒泡排序 3、快速排序 4、简单选择排序 5、其他 要求: 1、测试数据分成三类:正序、逆序、随机数据 2、对于这三类数据,比较上述排序算法中关键字的比较次数和移动次数(其 中关键字交换计为 3 次移动)。 3、对于这三类数据,比较上述排序算法中不同算法的执行时间,精确到微秒 4、对 2 和 3 的结果进行分析,验证上述各种算法的时间复杂度 编写测试 main()函数测试排序算法的正确性
时间: 2023-08-31 14:30:11 浏览: 90
由于涉及到多种排序算法和测试数据,代码较为复杂,以下仅给出各种排序算法的实现代码,具体的测试代码和结果分析可以根据实际情况进行编写。
1. 插入排序
```c++
void insertionSort(ListNode* head) {
if (!head || !head->next) return;
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* pre = head;
ListNode* cur = head->next;
while (cur) {
if (cur->val < pre->val) {
ListNode* p = dummy;
while (p->next->val < cur->val) p = p->next;
pre->next = cur->next;
cur->next = p->next;
p->next = cur;
cur = pre->next;
} else {
pre = cur;
cur = cur->next;
}
}
head = dummy->next;
}
```
2. 冒泡排序
```c++
void bubbleSort(ListNode* head) {
if (!head || !head->next) return;
ListNode* end = nullptr;
while (end != head->next) {
ListNode* p = head;
while (p->next != end) {
ListNode* q = p->next;
if (p->val > q->val) {
int tmp = p->val;
p->val = q->val;
q->val = tmp;
}
p = p->next;
}
end = p;
}
}
```
3. 快速排序
```c++
ListNode* partition(ListNode* start, ListNode* end, ListNode*& newStart, ListNode*& newEnd) {
ListNode* pivot = end;
ListNode* prev = nullptr;
ListNode* cur = start;
ListNode* tail = pivot;
while (cur != pivot) {
if (cur->val < pivot->val) {
if (!newStart) newStart = cur;
prev = cur;
cur = cur->next;
} else {
if (prev) prev->next = cur->next;
ListNode* tmp = cur->next;
cur->next = nullptr;
tail->next = cur;
tail = cur;
cur = tmp;
}
}
if (!newStart) newStart = pivot;
newEnd = tail;
return pivot;
}
ListNode* quickSortRecur(ListNode* start, ListNode* end) {
if (!start || start == end) return start;
ListNode* newStart = nullptr;
ListNode* newEnd = nullptr;
ListNode* pivot = partition(start, end, newStart, newEnd);
if (newStart != pivot) {
ListNode* tmp = newStart;
while (tmp->next != pivot) tmp = tmp->next;
tmp->next = nullptr;
newStart = quickSortRecur(newStart, tmp);
tmp = getTail(newStart);
tmp->next = pivot;
}
pivot->next = quickSortRecur(pivot->next, newEnd);
return newStart;
}
ListNode* quickSort(ListNode* head) {
head = quickSortRecur(head, getTail(head));
return head;
}
```
4. 简单选择排序
```c++
void selectionSort(ListNode* head) {
if (!head || !head->next) return;
ListNode* p = head;
while (p) {
ListNode* q = p->next;
ListNode* minNode = p;
while (q) {
if (q->val < minNode->val) minNode = q;
q = q->next;
}
int tmp = p->val;
p->val = minNode->val;
minNode->val = tmp;
p = p->next;
}
}
```
5. 其他排序算法
还有很多其他的排序算法,如归并排序、堆排序等,这里就不一一列举了。
其中,`getTail` 函数用于获取链表的尾节点,具体实现如下:
```c++
ListNode* getTail(ListNode* head) {
if (!head || !head->next) return head;
while (head->next) head = head->next;
return head;
}
```
阅读全文