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
#include2.問題描述
問題是讓我們改寫二分搜尋法,在乙個有序的序列中查詢乙個已知數,當這個數在陣列中時,返回小於這個數的最大元素的位置和大於這個數的最小元素的位置。當這個數小於這個序列的第乙個數,返回-1和0.當這個數大於序列最後乙個數
返回
陣列中最後乙個元素的位置和值。
3.演算法描述
先設定了乙個全域性變數(用來輔助輸出)
函式binarysearch:
設定兩個變數left和right
判斷要找的那個數是否在這個陣列範圍內,
如果小於第乙個數 返回-1
如果大於最後乙個數 返回 n(這個n是序列的個數,後來也是用來輔助輸出的)
如果在陣列內:
設定乙個迴圈(界限為left<=right)
設乙個變數 m = (left+right)/2
如果找到要找的數,將num=m,返回m
如果沒找到 返回right(因為推出迴圈,left肯定是大於right,意味著當left=right時,這個數大於在這個位置的數,所以返回right(這個位置的數是小於這個數的最大數))
演算法完整**如下:
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。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試...