設計乙個平均時間為o(n)的演算法,在n(1<=n<=1000)個無序的整數中找出第k小的數。(稱為:線性時間選擇演算法)
線性時間選擇隨機劃分法模仿隨機化快速排序演算法設計
利用「快排的或者類似二分」的思想,每次以樞紐為界,分兩邊,每次只需處理一邊即可(拋棄另一邊),平均情況下的執行時間界為o(n),這種演算法以期望時間做選擇。《演算法都論》裡是,在分治時用隨機數來選取樞紐(演算法導論中偽**見圖),好吧,這是理論上的演算法,它沒有考慮實際產生隨機數的開銷,事實上,效率一點也不高,已經測試過,產生隨機數花費的開銷真的很大,後邊我用更快的三數中值又實現了一遍,思想是一樣的,只是效率提高了。(另有實踐說法如上)
輸入格式:
輸入有兩行:
第一行是n和k,0
找第k小的數
description 給出一串數列,輸出其中第k小的數 input對於每乙個測試案例,通過鍵盤逐行輸入,第1行是輸入整數n 和 k 如果這兩個整數是0 就表示結束,不需要再處理 n表示有n個數,k表示第k小的數,接下來一行輸入n個數 output輸出第k小的數的值 example input 5 ...
找第k小的數
設計乙個平均時間為o n o n o n 的演算法,在n 1 n 1000 n 1 n 1000 n 1 n 1 000 個無序的整數中找出第k小的數。因為本題要求使用o n o n o n 的時間,所以不能直接採用排序然後輸出的方法來解題。因此採用分治方法,先任意找陣列中的乙個元素 a aa 中的...
找第K大或者小的數
這個題的解法 可以先通過排序得到第k個數即是第k大數。第二種解法就是利用快速排序的partition,這是一種隨機演算法,最壞情況下是n平方的,但是 平均情況下是 線性的。如下 此劃分的原理為,預設將地位的資料儲存,然後利用這個位置作為緩衝,不斷賦值。其中start永遠指向空位。最後將儲存的資料放入...