寫這個主要是爲了面試吧。複習下鏈表操做,既然鏈表快排就是拿來交互指針的,交互數據數據部分過大拷貝消耗怎麼辦?網上一些實如今這方面比較 扯淡。怎麼好多直接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; }