码迷,mamicode.com
首页 > 编程语言 > 详细

单链表快速排序

时间:2016-05-05 00:13:19      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

根据普通快排的思路,选择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");
}

 

 

排序后的结果:

 

技术分享

 

单链表快速排序

标签:

原文地址:http://www.cnblogs.com/JensenCat/p/5460037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!