1、實踐題目名稱:pta2-1 找第k小的數
2、問題描述:
3、演算法描述:
(1)主函式:陣列從下標1開始儲存n個數字,先通過find函式找到第k小的數是下標再輸出它的值。
(2)find函式:通過呼叫partition函式獲得樞紐mid,判斷mid是否第k小的下標,若是則直接返回下標;若不是,遞迴呼叫find函式繼續在左段或右段查詢。
(3)partition函式:將陣列中比樞紐值a[0]小的數都排在原陣列的左半部分,比樞紐值a[0]大的數都排在原陣列的右半部分。
(為了避免「第k個」和「k-1小標」混淆,修改了課本裡的partition函式,將a[0]作為樞紐來進行比較、交換左右,注意先右後左,順序不能變動)
4、演算法時間及空間複雜度分析:
最壞情況下,每次取得的樞紐為邊界值(最小值或最大值),即劃分區域包含n-1和1個元素時,由於partition計算時間為o(n),n>1時,t(n) = t(n-1) + o(n) = o(n^2);
最好情況下,每次取得的樞紐為恰好mid,左右兩邊均為為n/2;由n>1,t(n) = 2t(n/2) + o(n) = o(nlogn)。
(2)空間:
最好情況下空間複雜度為o(logn),最壞情況下需遞迴 n-1 次,空間複雜度為o(n)。
5、心得體會:對遞迴和分治有了更深的理解,能夠按個人需要修改partition函式(雖然也太大必要但過了就很開心),不過對時間、空間複雜度的分析還有待提高。
演算法第二章上機實踐報告
實踐題目名稱 找第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。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資...
演算法第二章上機實踐報告
1,實踐題目名稱 最大子列和問題 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試...