根據普通快排的思路,選擇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"); }
排序后的結果: