一、 實踐題目
第一題:二分查找
二、 問題描述
輸入n值(1<=n<=1000),n個非降序排列的整數以及查找的數x,使用二分查找x,輸出x所在的下標(0~n-1)及比較次數。若x不存在,輸出-1和比較次數。
三、 算法描述
1.關鍵部分算法描述:
int binary_search(vector<int>v,int key)
{
int left=1,right=v.size()-1,mid;
while(left<=right)
{
mid=(left+right)/2;
if(v[mid]<key) left=mid+1;
else if(v[mid]>key) right=mid-1;
else if(v[mid]==key) return mid;
}
return -1;
}
2.首先查找這個序列是有序的,從中間開始查找,如果小於或大於中間值,那么相應的最高和最低下標就要更改為中間值減一或加一。如此重復直到找到相應的值為止。
四、 算法時間及空間復雜度分析(要有分析過程)
時間復雜度:O(h)=O(log2n)
設共有n個元素,
經過while()的n值由n,n/2,n/4,…,n/2^k,由於n/2^k要取整,即令n/2^k = 1,可得k = log2n.
空間復雜度:0(n) = 1
沒有申請其他空間。
五、 心得體會(對本次實踐收獲及疑惑進行總結)
- 一個組進行編寫代碼,效率比自己一個編寫的時候要高。因為不用再某個地方卡很久,會有組員相互解釋。
2.更深一步理解了二分法,我覺得二分法是比較容易理解也比較容易實現的算法,但是二分法的要求是順序存儲以及數據都按照一定的規律排好序的,要求比較多,我們在實際應用的時候要根據需求靈活使用。
3.PTA上的錯誤有時候讓人摸不着頭腦,我們應該怎么提高答題的准確率呢?
