單鏈表快速排序


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

 

 

排序后的結果:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM