快排单链表

  • 使用值排序可以借助快排来实现单链表的排序
  • 借一张图:
  • 这里写图片描述
  • 代码如下:
//注意,慢指针始终停留在当前的最后一个小于pivot的节点上面
struct ListNode{
    ListNode * next;
    int val;
    ListNode(ListNode * _next, int _val) :
        next(_next), val(_val){}
};

ListNode * getPartion(ListNode * pHead, ListNode * pEnd)
{
    int key = pHead->val;
    ListNode * p = pHead;
    ListNode * q = pHead->next;
    while (q != pEnd->next){
        if (q->val < key){
            p = p->next;
            swap(p->val, q->val);
        }
        q = q->next;
    }
    swap(pHead->val, p->val);
    return p;
}

//快排链表,使用的是值交换的方式
ListNode * quickSort(ListNode * pBegin, ListNode * pEnd)
{
    if (pBegin != pEnd){
        ListNode * mid = getPartion(pBegin, pEnd);
        quickSort(pBegin, mid);
        quickSort(mid->next, pEnd);
    }
    return pBegin;
}
  • 第二次写,加上了一点测试用例
    public static void main(String[] args) {
        print p = new print();
        ListNode node1 = new ListNode(3);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(4);
        ListNode node4 = new ListNode(1);
        ListNode node5 = new ListNode(5);
        ListNode node6 = new ListNode(6);
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        ListNode res = p.quickSortLinkedList(node1, node6);
        System.out.println(res.val + " " + res.next.val + " " + res.next.next.val);
    }

    ListNode getPartion(ListNode begin, ListNode end) {
        if (begin == end || end == null)
            return null;
        ListNode p = begin, q = begin.next;
        while (q != end.next) {
            if (q.val < begin.val) {
                p = p.next;
                swap(p, q);
            }
            q = q.next;
        }
        swap(begin, p);
        return p;
    }

    private void swap(ListNode node1, ListNode node2) {
        int tmp = node1.val;
        node1.val = node2.val;
        node2.val = tmp;
    }

    ListNode quickSortLinkedList(ListNode begin, ListNode end) {
        ListNode mid = getPartion(begin, end);
        if (mid != null) {
            quickSortLinkedList(begin, mid);
            quickSortLinkedList(mid.next, end);
        }
        return begin;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值