題目: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
**:
#include
using 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)
int main()
int q = find(arr,0,n,k);
cout《演算法時間及空間複雜度分析:
最壞情況下的時間複雜度為o(n^2);
每次遞迴將問題分為兩個子問題,每個子問題中又有時間複雜度為o(n)的操作;
最好情況下,每次取得的基準為中值,即劃分產生兩個大小為n/2的區域,有t(n)=2t(n/2)+o(n);
得到時間複雜度為o(nlogn);
最好情況下空間複雜度為o(logn),遞迴呼叫最壞情況下呼叫n次,空間複雜度為o(n);
心得體會:
這次隊伍上機實驗,find函式其實並不複雜,只是在partition的基礎上進行修改而已,但partition函式裡的小細節,即大於小於符號,判斷數字是否超出界限等需要注意。
第二章上機實踐報告
1.實踐題目名稱 最大子列和問題 2.問題描述 7 1 最大子列和問題 20分 給定k個整數組成的序列,連續子列 被定義為,其中 1。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算...
演算法第二章上機實踐報告
實踐題目名稱 找第k個小的數 問題描述 設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。演算法描述 就是先假設a left 為這個分界值x,然後排序。比較x是不是第k個如果是,返回這個值。如果不是比較一下x和a k 的大小,如果xa k 遞迴在x的右邊找 演...
演算法第二章上機實踐報告
7 1 最大子列和問題 20分 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資...