python第二章上機實踐 演算法第二章上機實踐報告

2021-10-11 11:53:41 字數 1103 閱讀 7924

1.實踐題目名稱:

找第k小的數

2.問題描述:

在n(1<=n<=1000)個無序的整數中找出第k小的數,且時間複雜度為o(n)

3.演算法描述:

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

函式功能:將輸入的陣列進行排序,排序後的陣列需要滿足:基準左邊的數都小於基準,基準右邊的數都大於基準。

函式實現:以x = a[left]作為劃分的基準

初始 i = left, j = right + 1

while (a[++i]

while (a [--j]>x)從 a[j] 向左查詢比 a[left] 大的數

如果 i < j , 則將當前 a[i] 和 a[j] 交換

如果 i > j , 則此時劃分結束,將基準與當前 a[j]交換

迴圈結束,返回當前下標 j

② void find(int a,int left,int right,int k)

函式功能:通過呼叫partition函式獲得劃分點,判斷劃分點是否為第k小,若不是,遞迴呼叫find函式繼續在左段或右段查詢。

函式實現:呼叫partition函式獲得劃分點mid,比較 mid 和 k-1 的大小

如果相等,直接輸出 a[mid]

如果 mid > k-1 , find(a,left,mid-1,k) 往左邊找第k小的數

如果 mid < k-1 , find(a,mid+1,right,k) 往右邊找第k小的數

③ int main()

根據題目要求進行相應的輸入、儲存、呼叫、輸出

4.演算法時間及空間複雜度分析:

本題運用了分治法和快速排序法。呼叫partition函式尋找下標,時間複雜度為o(n),在find函式中利用了遞迴,最好情況下空間複雜度為o(logn),最壞情況下遞迴n-1次,空間複雜度為o(n)。

5.心得體會:

直接排序,再輸出第k個數,這個思路不符合題目要求。本題結合了分治法、快速排序和遞迴的思想,使問題變得更有條理,也更簡潔清晰。通過這道題,我對分治法的思想有了更深的理解,分治法能很大程度上節省時間,提高演算法的效率。今後在遇到此型別的題目時可以考慮採取分治法,分解、合併子問題,優化演算法。

python第二章上機實踐 第二章上機實踐報告

設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。輸入格式 輸入有兩行 第一行是n和k,0 第二行是n個整數 輸出格式 輸出第k小的數 輸入樣例 在這裡給出一組輸入。例如 10 4 2 8 9 0 1 3 6 7 8 2 輸出樣例 在這裡給出相應的輸出。例如 ...

演算法第二章上機實踐報告

實踐題目名稱 找第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。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資...