单链表快速排序
根据普通快排的思路,选择1个点为中心点,保证中心点左边比中心点小,中心点右边比中心点大即可.
单链表的实现为:
1.使第一个节点为中心点.
2.创建2个指针(p,q),p指向头结点,q指向p的下一个节点.
3.q开始遍历,如果发现q的值比中心点的值小,则此时p=p->next,并且执行当前p的值和q的值交换,q遍历到链表尾即可.
4.把头结点的值和p的值执行交换.此时p节点为中心点,并且完成1轮快排
5.使用递归的方法即可完成排序
#include<iostream> #include <time.h> using namespace std; //定义链表节点 struct _tNode { int nValue; _tNode* pNext; _tNode(){memset(this , 0 , sizeof(_tNode));} }; //////////////////////////////////// //单链表快速排序 /////////////////////////////////// void quickSort(_tNode* pBegin , _tNode* pEnd) { if(NULL == pBegin || NULL == pEnd || pBegin == pEnd) { return; } _tNode* pFirst = pBegin; _tNode* pSecond = pFirst->pNext; int nMidValue = pBegin->nValue; //开始排序 while(pSecond != pEnd->pNext && pSecond != NULL) { if(pSecond->nValue < nMidValue) { pFirst = pFirst->pNext; std::swap(pFirst->nValue , pSecond->nValue); } pSecond = pSecond->pNext; } //更换支点后完成1轮排序 std::swap(pBegin->nValue , pFirst->nValue); quickSort(pBegin , pFirst); quickSort(pFirst->pNext , pEnd);//此处的next很重要,不然将导致死循环 } void main() { srand(static_cast<unsigned int>(time(NULL))); const int nNodeCnt = 10; _tNode* pHead = new _tNode(); _tNode* pLastNode = pHead; //构造一个链表 for(int nCnt = 0; nCnt < nNodeCnt; ++nCnt) { _tNode* pNode = new _tNode(); pNode->nValue = rand() % 10; pLastNode->pNext = pNode; pLastNode = pNode; } //查看未排序前的输出 pLastNode = pHead; for(int nCnt = 0; nCnt < nNodeCnt; ++nCnt) { _tNode* pNode = pLastNode->pNext; pLastNode = pNode; cout<<pNode->nValue<<endl; } cout<<endl; //查看排序输出 quickSort(pHead , pHead + nNodeCnt); pLastNode = pHead; for(int nCnt = 0; nCnt < nNodeCnt; ++nCnt) { _tNode* pNode = pLastNode->pNext; pLastNode = pNode; cout<<pNode->nValue<<endl; } pLastNode = pHead; //删除包含HEAD以内的11个节点 for(int nCnt = 0; nCnt <= nNodeCnt; ++nCnt) { _tNode* pNode = pLastNode; pLastNode = pNode->pNext; delete pNode; } system("pause"); }
排序后的结果: