单链表的快速排序算法

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 单链表的快速排序
 *
 * @author Zg
 * @date 2021/8/8 17:57
 */
public class LinkListQuickSort {
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            Node node = change(makeRandomList());
            printNode(node);
            quicksort(node);
            printNode(node);
        }
    }

    static List<Integer> makeRandomList() {
        Random random = new Random();
        int len = random.nextInt(10) + 10;
        List<Integer> list = new ArrayList<>(len);
        for (int i = 0; i < len; i++) {
            list.add(random.nextInt(100));
        }
        return list;
    }

    static void quicksort(Node node) {
        if (node == null) {
            return;
        }
        quicksort(node, null);
    }

    static void quicksort(Node low, Node high) {
        if (low == high) return;
        Node par = partition(low, high);
        quicksort(low, par);
        quicksort(par.next, high);
    }

    static Node partition(Node low, Node high) {
        int key = low.data;

        Node slow = low;
        Node quick = low.next;

        while (quick != high) {
            if (quick.data < key) {
                slow = slow.next;
                // swap
                int temp = quick.data;
                quick.data = slow.data;
                slow.data = temp;
            }
            quick = quick.next;
        }
        // swap
        int temp = slow.data;
        slow.data = low.data;
        low.data = temp;
        return slow;
    }

    static class Node {
        int data;
        Node next;

        public Node() {
        }

        public Node(int data) {
            this.data = data;
        }

        public Node(int data, Node next) {
            this.data = data;
            this.next = next;
        }
    }

    static Node change(List<Integer> list) {
        Node dummy = new Node(), tail = dummy;
        for (Integer val : list) {
            tail.next = new Node(val);
            tail = tail.next;
        }
        return dummy.next;
    }

    static void printNode(Node node) {
        if (node == null) {
            System.out.println("null");
        }
        StringBuilder sb = new StringBuilder();
        while (node != null) {
            sb.append(node.data);
            if (node.next != null) {
                sb.append(" => ");
            }
            node = node.next;
        }
        System.out.println(sb.toString());
    }
}
posted @ 2021-08-08 18:28  yghr  阅读(313)  评论(0)    收藏  举报