链表的快速排列

 

    struct Node   
    {  
        int key;  
        Node* next;  
        Node(int nKey, Node* pNext)  
            : key(nKey)  
            , next(pNext)  
        {}  
    };  
      
/*
    基准值是start->data;
    将原链表看作2个链表:左链表和右链表,左链表最后一个节点就是基准值
    p1是左链表的最后一个节点,p2是右链表的最后一个节点
    因此,当遇到大于基准值的时候,p2一直右移;
    当遇到小于基准值的时候,p1右移一个,再交换p1和p2的值,相当于维持了p1和p2的定义
    一轮循环的最后,p2到达了end的位置,此时,应该交换p1和start节点的值,这时才是真正的一轮处理的结束
    下一轮,就递归调用 qs(start, p1) 和 qs(p1->next, end) 了。
*/
      
    Node* GetPartion(Node* pBegin, Node* pEnd)  
    {  
        int key = pBegin->key;  
        Node* p = pBegin;  
        Node* q = p->next;  
      
        while(q != pEnd)  // p到q之间的值为 大于Key的
        {                  // q 打头阵呢   比key小的 就要 swap 一下啊
            if(q->key < key)  
            {  
                p = p->next;  
                swap(p->key,q->key);   // 其思想还是找个key 小于key的在左边,大于key的放到右边
            }  
      
            q = q->next;  
        }  
        swap(p->key,pBegin->key);  
        return p;  
    }  
      
    void QuickSort(Node* pBeign, Node* pEnd)  
    {  
        if(pBeign != pEnd)  
        {  
            Node* partion = GetPartion(pBeign,pEnd);  
            QuickSort(pBeign,partion);  
            QuickSort(partion->next,pEnd);  
        }  
    } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值