写这个主要是为了面试吧。复习下链表操做,既然链表快排就是拿来交互指针的,交互数据数据部分过大拷贝消耗怎么办?网上一些实如今这方面比较 扯淡。怎么好多直接swap(value1, value2) 的。。。c++
数组快排比较好写,就是要方便,一种取巧的方法(本文不是这种方法),一个数组,每一个数组是一个结构体,包括指针,和对应拿来比较的值。这样拿去数组快排,而后按照快排后数组的指针信息重建链表。须要的额外空间就不大了。面试
下面是传统的递归快排。快排选择比key小的在key前面全都用指针交换实现。数组
#include <bits/stdc++.h> using namespace std; struct LinkNode { int val; LinkNode *next; LinkNode(int _v = 0):val(_v), next(nullptr) {} }; LinkNode* init_random_list(const vector<int>& init_list) { if(init_list.size() == 0) { return nullptr; } auto it = init_list.begin(); LinkNode *head = new LinkNode(*it); LinkNode *tmp = head; for(++it; it != init_list.end(); it++ ) { tmp->next = new LinkNode(*it); tmp = tmp->next; } return head; } void print_linklist(LinkNode *p) { bool first = true; while(p) { if(first) { first = false; } else { printf(" "); } cout << p->val; p = p->next; } cout << endl; } void quick_sort(LinkNode *lef, LinkNode *rig) { if(lef->next == rig) { return ; } LinkNode* p = lef, *q, *pos = lef->next; while(p->next != rig) { if(p->next->val < pos->val) { q = p->next; p->next = q->next; q->next = lef->next; lef->next = q; } else { p = p->next; } } quick_sort(lef, pos); quick_sort(pos, rig); } LinkNode* sort_linklist(LinkNode *p) { LinkNode* head = new LinkNode(), *q; head->next = p; quick_sort(head, nullptr); q = head; head = head->next; delete q; return head; } void delete_link(LinkNode *p) { if(p == nullptr) { return ; } delete_link(p->next); delete p; } int main() { int n; while(~scanf("%d", &n)) { LinkNode *head = nullptr, *p = head; for(int i = 1; i <= n; i++ ) { int x; scanf("%d", &x); if(head == nullptr) { head = new LinkNode(x); p = head; } else { p->next = new LinkNode(x); p = p->next; } } head = sort_linklist(head); print_linklist(head); delete_link(head); } return 0; }