找第k小的數

2021-08-30 17:56:03 字數 615 閱讀 8642

設計乙個平均時間為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(**中的 a

aa 為陣列的第乙個元素,亦可才用隨機數選取陣列中的任乙個元素),採用快速排序將陣列進行一次劃分,即將小於a的元素放在其左側,大於 a

aa 的元素放在其右側。

然後判斷元素 a

aa 是否滿足題目為第k小的數,滿足則直接輸出,否則判斷下一次在哪一區間進行劃分。

#includeusing namespace std;

typedef long long ll;

int patition(int a, int left, int right)

int main()

找第k小的數

description 給出一串數列,輸出其中第k小的數 input對於每乙個測試案例,通過鍵盤逐行輸入,第1行是輸入整數n 和 k 如果這兩個整數是0 就表示結束,不需要再處理 n表示有n個數,k表示第k小的數,接下來一行輸入n個數 output輸出第k小的數的值 example input 5 ...

找第K大或者小的數

這個題的解法 可以先通過排序得到第k個數即是第k大數。第二種解法就是利用快速排序的partition,這是一種隨機演算法,最壞情況下是n平方的,但是 平均情況下是 線性的。如下 此劃分的原理為,預設將地位的資料儲存,然後利用這個位置作為緩衝,不斷賦值。其中start永遠指向空位。最後將儲存的資料放入...

找第K小的數(O(N))(運用隨機思想)

設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。稱為 線性時間選擇演算法 線性時間選擇隨機劃分法模仿隨機化快速排序演算法設計 利用 快排的或者類似二分 的思想,每次以樞紐為界,分兩邊,每次只需處理一邊即可 拋棄另一邊 平均情況下的執行時間界為o n 這種演算...