標籤:二分尋找 時間複雜度 就會 問題 函數 方向 i++ 不難 大小
第二章實踐報告
二分尋找 實踐題目
輸入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
演算法描述
本題是典型的二分尋找,用了分治法的思想,每次遞迴的時候搜尋範圍就會減為原來的一半,並判斷與mid值的大小關係,實現尋找的計數,若尋找到了便返回下標,若尋找不到將返回-1。
演算法時間及空間複雜度分析
:每次二分會使尋找範圍減小一半
:,使尋找範圍減小到1至多要log(N)次,所以時間複雜度是O(logn)。
心得體會(對本次實踐收穫及疑惑進行總結)
這道題目是二分尋找法,難度較低,在實現本題目時用到的也是第二章所強調的分治法,在實現上並不難解決,在課堂上也很快地完成了但在實現上在尋找次數計算上num的值一直為0,這也是我們結對程式設計當時不能理解的一點,當時我們的輸出是cout<<調用函數<<numm,然後之後才發現cout的時候運算方向是從右至左,所以num並沒有在調用函數運行後輸出,而是輸出的是一個初始值,以後也會吸取教訓,多注意細節,後分開輸出便解決了這個bug。
代碼:
#include<iostream>
using namespace std;
int n;
int a[10000];
int x;
int num=0;
int erfen(int a[10000], int x, int left, int right){
if(left<right){
int mid = (left+right) / 2;
if(x<a[mid]){
num++;
return erfen(a,x,left,mid-1);
}
else if(x>a[mid]){
num++;
return erfen(a,x,mid+1,right);
}
else if(x==a[mid]){
num++;
return mid;
}
}
else{
if(x==a[left]){
num++;
return left;
}
else{
num++;
return -1;
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>x;
cout<<erfen(a,x,0,n-1)<<endl;
cout<<num;
return 0;
}
第二章上機實踐報告