算法第二章上機實驗報告
1、實踐題目
7-1 二分查找 (20 分)
輸入n值(1<=n<=1000)、n個非降序排列的整數以及要查找的數x,使用二分查找算法查找x,輸出x所在的下標(0~n-1)及比較次數。若x不存在,輸出-1和比較次數。
輸入格式:
輸入共三行:第一行是n值;第二行是n個整數;第三行是x值。
輸出格式:
輸出x所在的下標(0~n-1)及比較次數。若x不存在,輸出-1和比較次數。
輸入樣例:
4
1 2 3 4
1
輸出樣例:
0
2
2、問題描述
本道題是讓我們輸入非降序排列的整數,也就是說是排好序的了,然後輸入我們要查找的數字,如果找到了,就輸出所找的那個數在數組中的位置並輸出比較的次數;如果沒有找到的話,就輸出-1還有比較的次數。
3、算法描述
使用二分法查找,每查找一次,問題規模減小為原來的一般,即將輸入的序列存在一個數組裏,假設要查找的數字為x,那麽就是讓x與a[n/2]比較。如果兩者相等的話,那麽x就找到了,算法結束。若是不相等的話,則根據x是大於a[n/2]還是小於a[n/2]決定是要在哪一部分裏繼續尋找。若x>a[n/2],則在數組的右半部分繼續尋找;若x<a[n/2],則在數組的左半部分繼續尋找。
代碼如下:
#include <iostream>
using namespace std;
int BinarySearch(int a[],int x,int n){
int left = 0;
int right =n-1;
int count =0;
while(left <= right){
int middle = (left + right)/2;
count++;
if(x== a[middle]){
cout<<middle<<endl;
cout<<count;
return middle;
}
if(x>a[middle]){
left =middle + 1;
}
else {
right = middle -1;
}
}
cout<<"-1"<<endl;
cout<<count;
return -1;
}
int main(){
int n;
cin>>n;
int *a=new int[n];
for(int i=0; i<n;i++){
cin>>a[i];
}
int x;
cin>>x;
BinarySearch(a,x,n);
return 0;
}
4、算法時間及空間復雜度分析(要有分析過程)
對於n個元素:
第一次二分:n/2
第二次二分:n/2^2
......
m次二分:n/(2^m)
2^m=n;
故時間復雜度為:log2n
空間復雜度:因為各個變量的空間復雜度都是O(1),所以算法空間復雜度為O(1)。
5、心得體會(對本次實踐收獲及疑惑進行總結)
這次的二分查找算法實踐,加深了我對二分法的理解。因為書本上有二分法查找的相關內容,我們沒出現大問題。問題是出現在數組的定義上。我們一起找,沒找到,最後上網查了一下才知道原來是我們數組定義的時候出了錯!真的是有認真思考過才會印象深刻,因為我們在檢查的過程中一遍又一遍的看我們寫的代碼,所以現在是比較熟悉,在被第一道題目困住,最後解決之後,第二道題目很快就做出來了。
算法第二章上機實驗報告