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

2022-08-21 06:51:12 字數 1144 閱讀 1023

一、實踐題目名稱:

找第k小的數

二、問題描述:

設計乙個平均時間為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
三、演算法描述

這道題其實就是利用快速排序的思想,利用分治法,首先將這個問題進行分解,再遞迴求解,又因為是尋找第k小的數,所以不用進行合併。根據提示其實不需要完全排好序,而是邊排邊找。首先在find裡面呼叫partition將a[left:right]進行劃分,並返回基準元素x的位置。再將x跟k比較,如果x比k小,說明第k小的數在右邊,就繼續遞迴呼叫find在右邊進行查詢;反之,說明第k小的數在左邊,就呼叫find在左邊進行查詢。

四、演算法時間及空間複雜度分析

演算法時間其實跟快速排序是差不多的,在最好情況下 t(n) = 2t(n/2) + o(n) = o(nlogn),在最壞情況下 t(n) = t(n-1) + o(n) = o(n^2)。空間複雜度是o(n)。

五、**:

1 #include2

3using

namespace

std;45

int partition(int a, int left, int

right)

621 a[left] =a[j];

22 a[j] =x;

23return

j;24}25

26int find(int a, int left, int right, int

k)27

3637

intmain()38

4647 cout << find(a, 0, n-1

, k);

4849

return0;

50 }

六、心得體會

這道題就是利用快速排序的演算法,一開始就錯在了x和k的比較上,因為陣列是從0開始,所以要跟k-1比較。

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

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