快排单链表

来源:互联网 发布:丰臣秀吉知乎 编辑:程序博客网 时间:2024/06/05 03:26
  • 使用值排序可以借助快排来实现单链表的排序
  • 借一张图:
  • 这里写图片描述
  • 代码如下:
//注意,慢指针始终停留在当前的最后一个小于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;    }
0 0