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