单链表快速排序
2016-09-04 16:38
183 查看
详细解释在代码中,主要思路是将链表分为三个部分,小于key的链表,等于key的链表,大于key的链表
#include <iostream> #include<string> #include <vector> #include <algorithm> using namespace std; class node { public: int value; node *next; node():value(0),next(NULL) { } node(int val):value(val),next(NULL) { } }; void LinkQuickSort(node*&head) { if (NULL == head->next ) { return; } const int key = head->value; //将链表拆分为三部分 node *left = new node;//小于key的链表伪头结点 node *right = new node;//大于key的链表伪头结点 node *middle = head;//等于key的链表头结点 node *lastLeft,*lastRight,*temp,*lastMiddle; lastRight = right;//记录链表最后一个节点 lastLeft = left; lastMiddle = middle; temp=head->next;//从第二个元素开始 lastMiddle->next = NULL; while(NULL != temp) { if((temp->value)> key) { lastRight->next = temp; lastRight = lastRight->next; temp = temp->next; lastRight->next=NULL; } else if ((temp->value) < key) { lastLeft->next = temp; lastLeft = lastLeft->next; temp = temp->next; lastLeft->next=NULL; } else { lastMiddle->next = temp; lastMiddle = lastMiddle->next; temp = temp->next; lastMiddle->next=NULL; } } temp = left; left = left->next; temp->next = NULL; delete temp;//删除伪头结点 temp = right; right = right->next; temp->next = NULL; delete temp; if(NULL != left) LinkQuickSort(left); if (NULL != right) LinkQuickSort(right); //合并三个链表 if (NULL != left)//做链表不为空 { temp = left; head = left; while(temp->next!=NULL)//定位最后一个节点 { temp = temp->next; } temp->next = middle; } else { head = middle; } lastMiddle->next = right;//right 为NULL也无所谓 } int main() { node *head=new node; node *temp = head; temp->next = new node(5); temp = temp->next; temp->next = new node(19); temp = temp->next; temp->next = new node(19); temp = temp->next; temp->next = new node(22); temp = temp->next; temp->next = new node(44); temp = temp->next; temp = head; head = head->next; temp->next = NULL; delete temp; LinkQuickSort(head); temp = head; while(temp!=NULL) { cout << temp->value <<" "; temp = temp->next; } cout << endl; return 0; }