第二章上機實踐報告

來源:互聯網
上載者:User

標籤:二分尋找   時間複雜度   就會   問題   函數   方向   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;
}

第二章上機實踐報告

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.