線性時間選擇

2021-05-24 09:41:52 字數 472 閱讀 6999

今天學習了線性時間選擇,主要是通過快排的方法,在乙個平均時間線性的情況下進行第k小元素的選擇,結合一道題目進行描述;

題目來自演算法設計與分析就是王曉東的那本;

output.txt

這題目分析一下可以得出就是尋找中位數;為什麼呢?將這些數字排列在數軸上尋找乙個到各個點距離最小的那個點,可以得知最中間的那個兩個點之間的任意位置都是可以的,這是因為其他點到這一點都沒有重複的距離出了這個區間都是會存在重複的。所以問題就是尋找這個中位數即可;

那麼怎麼尋找這個中位數呢?在快排中我們很容易得到乙個數在一堆無序數列中的位置,並同時是其左側是都是比他小的數,右側都是比他大的數,若這個位置是中間位置那麼這個數就是中位數,若這個位置在中間的右側,那說明中位數在這數的左側,否則在其右側,這樣不斷遞迴下去一定會找到這個數,最壞的情況下這個演算法的效率是n2 。想要加速這個演算法就又要使快排過程盡量隨機化就是使左右兩側的數的個數盡量相等。這和快排的隨機性是一致的。

**如下:

線性時間選擇

出自 http algorithm.chaoskey.com 02 07 題目 給定線性序集中n個元素和乙個整數k,1 k n,要求找出這n個元素中第k小的元素,這裡給定的線性集是無序的 具體解題 這裡我們將所有的數 n個 以每5個劃分為一組,共 n 5 組 將不足五個的那組忽略 然後用任意一種排序...

線性時間選擇

這相當於是對於快速排序的基準選擇的乙個優化,使得選擇演算法達到線性時間。include include include includevoid swap int a,int b int compare const void a,const void b int partition int a,int...

線性時間選擇

參考演算法設計與分析。include using namespace std inline int random int x,int y int partition int a,int p,int r,int k return j 返回i跟返回j是一樣的。int select int a,int p...