Java單鏈表實現快速排序
阿新 • • 發佈:2019-01-24
普通快排的思路
選擇1個結點為中心點,保證中心點左邊比中心點小,中心點右邊比中心點大即可。這就是一次快排,確定一個數的正確位置,然後進行遞迴。
單鏈表的實現為
- 使第一個節點為中心點
- 建立2個指標(p,q),p指向頭結點,q指向p的下一個節點
- q開始遍歷,如果發現q的值比中心點的值小,則此時p=p->next,並且執行當前p的值和q的值交換,q遍歷到連結串列尾即可
- 把頭結點的值和p的值執行交換。此時p節點為中心點,並且完成1輪快排
- 使用遞迴的方法即可完成排序
具體函式實現
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;
}