單鏈錶快速排序
點選(此處)摺疊或開啟
-
public class LinkedListSortTest {
-
//bubble up
-
public static ListNode sortList(ListNode head) {
-
ListNode m = head;
-
ListNode tail = null;
-
while (m != tail && m.next != null) {
-
ListNode n = head;
-
while (n.next != null) {
-
if (n.next.val < n.val) {
-
swap(n, n.next);
-
}
-
n = n.next;
-
}
-
tail = n;
-
m = m.next;
-
}
-
return head;
-
}
-
-
//quick sort
-
public static ListNode sortList2(ListNode head) {
-
ListNode next = head.next;
-
if (next == null) { // 1 element
-
return head;
-
} else if (next.next == null) { // 2 elements
-
if (head.val > next.val) {
-
swap(head, next);
-
}
-
return head;
-
} else {
-
ListNode mid = getMidNode(head);
-
return merge(sortList(head), sortList(mid));
-
}
-
}
-
-
-
private static ListNode merge(ListNode m, ListNode n) {
-
// System.out.println("Merge " + m + " with " + n);
-
-
ListNode head = new ListNode(0);
-
ListNode tail = head;
-
while (m != null && n != null) {
-
if (m.val < n.val) {
-
tail.next = m;
-
m = m.next;
-
} else {
-
tail.next = n;
-
n = n.next;
-
}
-
tail = tail.next;
-
}
-
if (m != null) {
-
tail.next = m;
-
}
-
if (n != null) {
-
tail.next = n;
-
}
-
// System.out.println("Merge result : " + head.next);
-
return head.next;
-
}
-
-
private static ListNode getMidNode(ListNode n) {
-
ListNode fast = n;
-
ListNode slow = n;
-
while (true){
-
if (fast.next != null) {
-
fast = fast.next;
-
if (fast.next != null) {
-
fast = fast.next;
-
slow = slow.next;
-
continue;
-
}
-
}
-
break;
-
}
-
ListNode mid = slow.next;
-
slow.next = null;
-
return mid;
-
}
-
-
private static void swap(ListNode n, ListNode m) {
-
int v = n.val;
-
n.val = m.val;
-
m.val = v;
-
}
-
-
public static void main(String[] args) {
-
ListNode head = new ListNode(0);
-
int i = 0;
-
ListNode n = head;
-
while (i++ < 20) {
-
n.next = new ListNode(i * 37 % 50);
-
// n.next = new ListNode(i);
-
n = n.next;
-
}
-
-
print(head);
-
print(sortList(head));
-
print(sortList2(head));
-
-
}
-
-
public static void print(ListNode n) {
-
while (n != null) {
-
System.out.print(n.val + " ");
-
n = n.next;
-
}
-
System.out.println();
-
}
-
-
}
-
-
class ListNode {
-
int val;
-
ListNode next;
-
-
ListNode(int x) {
-
val = x;
-
}
-
-
public String toString() {
-
ListNode n = this;
-
StringBuilder sb = new StringBuilder("[");
-
while (n != null) {
-
sb.append(n.val + " ");
-
n = n.next;
-
}
-
sb.deleteCharAt(sb.length() - 1);
-
sb.append("]");
-
return sb.toString();
-
}
- }
148. Sort List
Sort a linked list in O(n log n) time using constant space complexity.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10742815/viewspace-2132712/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 演算法單鏈錶快速排序演算法實現演算法排序
- 簡單快速排序排序
- 單鏈錶鏈式結構的建立
- 快速排序的簡單理解排序
- 快速排序就這麼簡單排序
- 排序之快速排序排序
- 排序:氣泡排序&快速排序排序
- 快速排序排序
- 快速排序&&歸併排序排序
- 快速排序快速入門排序
- 四、歸併排序 && 快速排序排序
- 選擇排序和快速排序排序
- 排序演算法__快速排序排序演算法
- 排序演算法:快速排序排序演算法
- 排序演算法-快速排序排序演算法
- 排序演算法——快速排序排序演算法
- 排序演算法 - 快速排序排序演算法
- 快速排序法排序
- java 快速排序Java排序
- 快速排序javaScript排序JavaScript
- js 快速排序JS排序
- javascript 快速排序JavaScript排序
- 分治—快速排序排序
- QuickSort 快速排序UI排序
- 快速排序-java排序Java
- [JAVA]快速排序Java排序
- 快速排序 java排序Java
- php插入排序,快速排序,歸併排序,堆排序PHP排序
- 排序演算法之 '快速排序'排序演算法
- #排序演算法#【4】快速排序排序演算法
- 《排序演算法》——快速排序(Java)排序演算法Java
- 從簡單的快速排序說起-Partition-ThreePartition-TopK排序TopK
- 遞迴-*快速排序遞迴排序
- 圖解快速排序圖解排序
- 三種快速排序排序
- 快速排序C++排序C++
- 【筆記】快速排序筆記排序
- 快速排序(Quick Sort)排序UI