第二章實驗報告

2022-08-11 17:18:09 字數 1184 閱讀 8328

實踐題目名稱:找第k小的數

1.問題描述:

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

輸入格式:

輸入有兩行:

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

輸出格式:

輸出第k小的數

輸入樣例:

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

10 4

2 8 9 0 1 3 6 7 8 2

輸出樣例:

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

演算法描述:

題設提示使用快速排序,在總共有x個數的時候,每層遞迴時所選取的參照數在該層遞迴排序完後,其必定位於次數列第y個空間,前面y-1個數都比它小,後面x-y個數都大於它,即為它即是該數列中第y小的數。因此只需在快速排序的過程中找到在排序後位於第k個空間的參照數,這個數即為我們所要求的第k小的數。

1 #include

2 using namespace std;

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

13     a[left]=a[r];

14     a[r]=x;

15     return r;

16 }

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

25         else find(a,m+1,right,k);

26     }

27 }

29 int main()

35     int result = find(a,1,n,k);

36     cout << result;

37     return 0;

38 }

2.演算法時間及空間複雜度分析(要有分析過程):

設演算法的複雜度為t(n),

第一步分解為兩個子問題為o(1)

第二步分別求解兩個子問題為o(n/2)*2

第三步合併子問題為o(n)

等式為:t(n)=o(1)+2t(n/2)+o(n)

得:t(n)=o(nlogn);

心得體會(對本次實踐收穫及疑惑進行總結)

實驗的目的是運用快速排序演算法進行第k小的數的查詢,雖然運用快速排序演算法的思想,但卻並不完全相同,能夠幫助我們複習掌握快速排序演算法的同時,又發現學習到一些新的東西,舉一反三。

第二章上機實驗報告

1 實踐題目 兩個有序序列的中位數 2 題目描述 知有兩個等長的非降序序列s1,s2,設計函式求s1與s2並集的中位數。有序序列a 0 a 1 a n 1 的中位數指a n 1 2 的值,即第 n 1 2 個數 a 0 為第1個數 輸入分三行。第一行給出序列的公共長度n 0 100000 隨後每行輸...

演算法第二章實驗報告

7 1 二分查詢 輸入n值 1 n 1000 n個非降序排列的整數以及要查詢的數x,使用二分查詢演算法查詢x,輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出 1和比較次數。輸入共三行 第一行是n值 第二行是n個整數 第三行是x值。輸出x所在的下標 0 n 1 及比較次數。若x不存在,輸出...

演算法第二章作業 實驗報告

實踐報告任選一題進行分析。內容包括 實踐題目名稱 7 1 最大子列和問題 問題描述 給定k個整數組成的序列,連續子列 被定義為,其中 1。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的...