思路:
1、以头节点为base,依次遍历,与base比较,比base小的放前面;返回base指针
2、递归调用上述过程
代码:
package com.datastructure.link;
/**
* 单链表快排
*/
public class SingleLinkedListQuickSort {
static class Node {
int value;
private Node next;
public Node (int value) {
this.value = value;
}
@Override
public String toString() {
if (this.next == null) {
return String.valueOf(this.value);
}
return this.value + "->" + this.next.toString();
}
}
public static void quickSort(Node head) {
if (head == null || head.next == null) {
return;
}
quickSort(head, null);
}
private static void quickSort(Node begin, Node end) {
if (begin != end && begin.next != end) {
Node p = partition(begin, end);
quickSort(begin, p);
quickSort(p.next, end);
}
}
private static Node partition(Node begin, Node end) {
int baseVal = begin.value;
Node base = begin;
Node cur = begin.next;
// 快速排序之单向划分方式
while (cur != end) {
if (cur.value < baseVal) {
base = base.next;
swap(base, cur);
}
cur = cur.next;
}
swap(base,begin);
System.out.println(base);
return base;
}
private static void swap(Node node1, Node node2) {
int temp = node1.value;
node1.value = node2.value;
node2.value = temp;
}
public static void main(String[] args) {
Node node1 = new Node(5);
Node node2 = new Node(4);
Node node3 = new Node(3);
Node node4 = new Node(2);
Node node5 = new Node(1);
Node node6 = new Node(0);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
System.out.println("Origin link: " + node1);
quickSort(node1);
System.out.println("Sorted link: " + node1);
}
}
参考:
快速排序的几种实现方式及性能比较:https://blog.csdn.net/u013074465/article/details/42083607/