快速排序及尋找最小的k個數

2021-06-20 12:19:03 字數 1842 閱讀 7179

快速排序

快速排序採用的是分治策略: 

在乙個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...