快速選擇演算法c

2021-10-04 15:08:48 字數 1464 閱讀 6487

quick selection演算法和quick sort演算法是由同乙個作者提出,這兩者之間有很大的相似之處——分治,即將問題的規模一次次的減小,直到求出最終解,時間複雜度o(n),且資料無需有序

目標:找到第n大的數

隨機產生乙個pivot

根據這個pivot,將小於其值的數放左邊,大於其值的數放右邊

更新第n大數的估計值的位置,選擇其中一邊,直到=n

重複2、3步驟.

操作的情況大致如下圖所示:v即為pivot

假設找的數以平均情況計算(被找的數每次都在中間部分),令o(n)為總的時間複雜度,n+o(n/2)為第o(n)次查詢所需要的時間。按照以下公式進行遞推,可以推出,最終o(n)近似等於2n,即o(n)=n

而最壞情況時(被找的數每次都在最邊上)o(n)=n2。當然也不用過於擔心,有很多方式,通過重新洗牌,使資料盡量的無序,達到平均情況。(shuffle、turkeys』s ninth 等還是挺不錯的)

以上簡介**

p:前指標,q:後指標。

p所指位置為pivot(此時的pivot隨著p的變化而改變)

p前進的條件是:當q所指位置的值大於p所知位置的值

qleftright遍歷陣列元素

#includeusing namespace std;

int a[1000];

int quickselect(int k, int left, int right)

} if(p == k)

return p;

else if(p < k)

return quickselect(k, p + 1, right);

else

return quickselect(k, left, p - 1);

}int main ()

quickselect(1, 0, n - 1);

cout << a[1] << endl;

for(int i = 0; i < n; i++)

cout << endl;

} return 0;

}

快速選擇演算法

摘要 選擇第k小的元素,用快速排序的思想可以以平均o nlogn 的時間界做到.1 首先找到中間值,並且進行排序。2 如果左邊的子串行的長度 s1 k 1,那麼很顯然中間值就是所求.3 如果左邊的子串行的長度 s1 k,那麼顯然這個所求元素就在子串行s1裡面,遞迴的在s1裡面求解 4 如果 s1 k...

快速選擇演算法

快排的每一趟,數軸的左邊都會是 x 的,右邊都是 x 的。左邊元素的個數是 s1 j l 1,如果k s1 的話,那麼下次遞迴的區間就是左邊,否則右邊。直到 l r 時返回q l 時間複雜度 o n c include using namespace std const int n 1e5 10 i...

Quick Selection(快速選擇演算法)

常年見到快速排序演算法,當在普林斯頓大學的網課上看到這個quick selection演算法的時候,直接蒙住了 這個是什麼,和快速排序有什麼關係啊?於是迅速查閱了維基百科,大致了解了其思想,再結合課程中的ppt,終於搞明白了。不得不說這是個很巧妙的演算法,把原先要o nlogn 複雜度的問題,簡化為...