Java單鏈表實現快速排序

普通快排的思路

選擇1個結點爲中心點,保證中心點左邊比中心點小,中心點右邊比中心點大即可。這就是一次快排,確定一個數的正確位置,然後進行遞歸。

單鏈表的實現爲

  1. 使第一個節點爲中心點
  2. 創建2個指針(p,q),p指向頭結點,q指向p的下一個節點
  3. q開始遍歷,如果發現q的值比中心點的值小,則此時p=p->next,並且執行當前p的值和q的值交換,q遍歷到鏈表尾即可
  4. 把頭結點的值和p的值執行交換。此時p節點爲中心點,並且完成1輪快排
  5. 使用遞歸的方法即可完成排序

具體函數實現

public void quickSort(ListNode begin, ListNode end) {
        //判斷爲空,判斷是不是隻有一個節點
        if (begin == null || end == null || begin == end)
            return;
        //從第一個節點和第一個節點的後面一個幾點
        ListNode first = begin;
        ListNode second = begin.next;

        int nMidValue = begin.val;
        //結束條件,second到最後了
        while (second != end.next && second != null) {
            if (second.val < nMidValue) {
                first = first.next;
                //判斷一下,避免後面的數比第一個數小,不用換的局面
                if (first != second) {
                    int temp = first.val;
                    first.val = second.val;
                    second.val = temp;
                }
            }
            second = second.next;
        }
        //判斷,有些情況是不用換的,提升性能
        if (begin != first) {
            int temp = begin.val;
            begin.val = first.val;
            first.val = temp;
        }
        //前部分遞歸
        quickSort(begin, first);
        //後部分遞歸
        quickSort(first.next, end);
    }

在main函數是這樣的

public static void main(String[] args) {
        ListNode head = new ListNode(2);
        ListNode l1 = new ListNode(2);
        ListNode l2 = new ListNode(5);
        ListNode l3 = new ListNode(3);
        ListNode l4 = new ListNode(8);
        ListNode l5 = new ListNode(4);
        ListNode l6 = new ListNode(2);
        ListNode l7 = new ListNode(1);

        /*ListNode p = l1;
        System.out.println(p.equals(head));
        System.out.println(p == head);*/

        head.next = l1;
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;
        l5.next = l6;
        l6.next = l7;
        l7.next = null;

        ListNode p = head;
        while (p.next != null) {
            System.out.print(p.val);
            p = p.next;
        }
        System.out.print(p.val);
        System.out.println();

        ListNode begin = head, end = p;
        new SingleLinkedListSorting().quickSort(begin, end);

        p = head;
        while (p != null) {
            System.out.print(p.val);
            p = p.next;
        }

測試結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章