上機實踐報告 2 1 找第k小的數 25分

2022-08-21 04:45:16 字數 777 閱讀 9785

2-1 找第k小的數 (25分)

設計乙個平均時間為o(n)的演算法,在n(1<=n<=1000)個無序的整數中找出第k小的數。

輸入有兩行:

第一行是n和k,0第二行是n個整數

輸出第k小的數

在這裡給出一組輸入。例如:

10 4

2 8 9 0 1 3 6 7 8 2

在這裡給出相應的輸出。例如:

2

#includeusing namespace std;

int partition(int a,int left,int right)

a[left] = a[j];

a[j] = x;

return j;

}int find(int a,int left,int right,int k)

else if (k-1 < q)

else

return 0;

}int main()

int num = find(a,0,n-1,k);

cout << a[num] << endl;

return 0;

}

時間複雜度:partition演算法的時間複雜度o(n),最壞情況下,會將n個元素分為n-1與1的組合,此時t(n)=o(n^2);

最好情況下,每次都產生n/2的區域,則此時t(n)=o(nlogn)

空間複雜度:o(n),有存放無序數的陣列

找第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永遠指向空位。最後將儲存的資料放入...