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

2022-07-21 19:51:14 字數 1685 閱讀 7126

1.實踐題目

7-2 改寫二分搜尋演算法 (20 分)

設a[0:n-1]是已排好序的陣列,請改寫二分搜尋演算法,使得當x不在陣列中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置。

輸入有兩行:

第一行是n值和x值; 第二行是n個不相同的整數組成的非降序序列,每個整數之間以空格分隔。

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

6 5

2 4 6 8 10 12

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

1 2

2.問題描述

問題是讓我們改寫二分搜尋法,在乙個有序的序列中查詢乙個已知數,當這個數在陣列中時,返回小於這個數的最大元素的位置和大於這個數的最小元素的位置。當這個數小於這個序列的第乙個數,返回-1和0.當這個數大於序列最後乙個數

返回陣列中最後乙個元素的位置和值。

3.演算法描述

先設定了乙個全域性變數(用來輔助輸出)

函式binarysearch:

設定兩個變數left和right

判斷要找的那個數是否在這個陣列範圍內,

如果小於第乙個數 返回-1

如果大於最後乙個數 返回 n(這個n是序列的個數,後來也是用來輔助輸出的)

如果在陣列內:

設定乙個迴圈(界限為left<=right)

設乙個變數 m = (left+right)/2

如果找到要找的數,將num=m,返回m

如果沒找到 返回right(因為推出迴圈,left肯定是大於right,意味著當left=right時,這個數大於在這個位置的數,所以返回right(這個位置的數是小於這個數的最大數))

演算法完整**如下:

#include

using namespace std;

int num=-2;

int binarysearch(int a,int t,int n)

if(t>a[m]) left = m+1;

else right = m-1;

}return right;}}

int main()

int e;

e=binarysearch(b,d,a);

if(e==-1) cout<

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

總共有n個元素。

第1次折半:還剩n/2個元素

第2次折半:還剩n/4個元素

第3次折半:還剩n/8個元素

……第k次折半:還剩n/2^k個元素

最壞的情況下,最後還剩1個元素,令n/2^k = 1。得k=logn。

時間複雜度o(logn)

由於輔助空間是常數級別的所以:

空間複雜度是o(1);

5.心得體會

這個道的思路是比較簡單的,唯一比較難的是返回那個right的時候想了挺久的。通過這次結對程式設計,共同體會到和同伴一起思考一起討論,然後解決問題的那種很好的感覺。也通過實踐,加深了對課本知識的理解。

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

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