在平均狀況下,排序 n 個專案要ο(n log n)次比較。在最壞狀況下則需要ο(n
2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他ο(n log n) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出來。
快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)。
步驟為:
從數列中挑出乙個元素,稱為 "基準"(pivot),
重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把乙個元素擺到它最後的位置去。
快速排序是二叉查詢樹(二叉查詢樹)的乙個空間優化版本。不是循序地把資料項插入到乙個明確的樹中,而是由快速排序組織這些資料項到乙個由遞迴呼叫所隱含的樹中。這兩個演算法完全地產生相同的比較次數,但是順序不同。對於排序演算法的穩定性指標,原地分割槽版本的快速排序演算法是不穩定的。其他變種是可以通過犧牲效能和空間來維護穩定性的。
快速排序的最直接競爭者是堆排序(heapsort)。堆排序通常比快速排序稍微慢,但是最壞情況的執行時間總是o(n log n)。快速排序是經常比較快,除了introsort變化版本外,仍然有最壞情況效能的機會。如果事先知道堆排序將會是需要使用的,那麼直接地使用堆排序比等待 introsort 再切換到它還要快。堆排序也擁有重要的特點,僅使用固定額外的空間(堆排序是原地排序),而即使是最佳的快速排序變化版本也需要θ(log n)的空間。然而,堆排序需要有效率的隨機訪問才能變成可行。
快速排序也與歸併排序(mergesort)競爭,這是另外一種遞迴排序演算法,但有壞情況o(n log n)執行時間的優勢。不像快速排序或堆排序,歸併排序是乙個穩定排序,且可以輕易地被採用在鍊錶(linked list)和儲存在慢速訪問**上像是磁碟儲存或網路連線儲存的非常巨大數列。儘管快速排序可以被重新改寫使用在煉序列上,但是它通常會因為無法隨機訪問而導致差的基準選擇。歸併排序的主要缺點,是在最佳情況下需要ω(n)額外的空間。
1public
class
quick27
8/**
9* 快速排序
10*
11*
@param
arr an array of comparable items
12*
@param
left the left-most index
13*
@param
right the right-most index
14*/
15public
static
extends comparable<? super t>> void quicksort(t arr, int left, int
right)
1628 arr[i] =arr[j];
29//
大於中軸點的值移動到數列的右側
30while(i < j && arr[i].compareto(pivot) <= 0)
3134 arr[j] =arr[i];35}
36 arr[i] = pivot;//
中軸點的值為pivot
37 middle = i;//
中軸點為i
38 quicksort(arr, left, middle - 1);
39 quicksort(arr, middle + 1, right);40}
4142
public
static
void
main(string args)43;
45quick(arr);
46for(int i = 0; i < arr.length; i++)
4750
}51 }
排序 快速排序
快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...
排序 快速排序
定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...
排序 快速排序
時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...