快速排序
快速排序採用的是分治策略:
在乙個list
中選擇乙個基準值
(pivot value)
,將list
中比基準值小的元素排在基準值的左側,比基準值大的元素排在基準值的右側,形成兩個
sub-list
;然後對
sub-list
進行同樣的操作,直至整個
list
排序完成。
partition偽**
// pseudocode of partition
function partition(a, left, right)
pivotindex := (left + right) / 2;
pivotvalue := a[pivotvalue];
storeindex := left;
for i from left to right-1
if a[i] < pivotvalue
swap(a[i], a[storeindex]);
storeindex := storeindex;
swap(a[right], a[storeindex]);
return storeindex;
pivotindex有多種選擇方式,這裡採用
list
的中間index
作為pivotindex .
storeindex是所有小於
pivotvalue
的元素的後面乙個
index
,每次交換就是
a[storeindex]
和a[i].
quicksort偽**
// psedocode of quicksort
function quicksort(a, left, right)
if right > left
pivotindex := partition(a, left, right);
quicksort(a, left, pivotindex-1);
quicksort(a, pivotindex+1, right);
尋找最小的k個數與快速排序類似,仍然採用分治策略,不同的是,不必對每個sub-list
都進行partition,
只對需要的
sub-list
進行partition
。執行結束後,最小的
k個數排在陣列的前
k個位置,但是,這
k個數可能並沒有經過排序。
演算法導論第9
章有該演算法的實現:
參考:
[1]
[2] 演算法導論,第三版,第9章
尋找最小的k個數
尋找最小的k個數 在乙個長度為n的陣列中,尋找最小的k個數。最大的k個數解法類似 想法比較簡單,先對n個數排序,再輸入前面k個數,即可。這種方法的時間複雜度比較大。假設我們使用快排,需要o nlogn 然後輸出k個數需要o k 一共要o nlogn 略。這種方法比較好,演算法簡單,易於實現。先把陣列...
尋找最小的k個數
輸入n個整數,輸出其中最小的k個。要求乙個序列中最小的k個數,按照慣有的思維方式,則是先對這個序列從小到大排序,然後輸出前面的最小的k個數。至於選取什麼的排序方法,我想你可能會第一時間想到快速排序 我們知道,快速排序平均所費時間為n logn 然後再遍歷序列中前k個元素輸出即可。因此,總的時間複雜度...
尋找最小的 k 個數
輸入n個整數,輸出其中最小的k個。使用排序的方法來解決該問題。快速排序所費時間複雜度為o n logn 排序完成過後,只需要取前k個數值即是最小的k個數。int array const int length sizeof array sizeof array 0 void printarray in...