針對PTA上算法第二章實踐中的第二題進行分析ios
實踐題目:算法
算法第二章上機實踐報告數組
問題描述:函數
設a[0:n-1]是已排好序的數組,請改寫二分搜索算法,使得當x不在數組中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜索元素在數組中時,i和j相 同,均爲x在數組中的位置。spa

算法分析:blog
#include<iostream>
using namespace std;
void find(int a[],int x,int n) //定義一個函數,經過二分查找判斷x位於數組中的哪一個位置或者應插入數組的哪一個位置
{
int l=0;int r=n-1;
while(l<=r)
{
int mid=(l+r)/2;
if(x==a[mid])
{
cout<<mid<<" "<<mid;
return;
}
else if(x>a[mid])
{
l=mid+1;
}
else
{
r=mid-1;
}
}
if(x<a[l]) cout<<l-1<<" "<<l;//以a[l]爲界,若是x在a[l]左邊,那麼輸出l以及l+1
if(x>a[l]) cout<<l<<" "<<l+1;//若是x在a[l]左邊,那麼輸出l-1以及l
return;
}
int main()
{
int n,x,p;
int a[100001];
cin>>n;
cin>>x;
for(int i=0;i<n;i++)
cin>>a[i];
if(x<a[0])//若x小於所有數值
{
cout<<-1<<" "<<0;
}
else if(x>a[n-1])//若x大於所有數值
{
cout<<n-1<<" "<<n;
}
else//
find(a,x,n);
return 0;
}
算法時間及空間複雜度分析:ci
該算法的時間複雜度爲O(log2 n)io
空間複雜度爲O(1)stream
心得體會:搜索
原先老師還沒要求時間複雜度爲O(log2 n)時,我是直接在main函數裏直接寫了if進行判斷的,而後一堆的判斷語句。把時間複雜度擴大到了O(n)。後來就開始思索要怎樣將複雜度變小。最後就反思本身的代碼,思考如何在二分查找的find函數裏進行大小判斷,這樣就能夠將時間複雜度變爲O(log2 n)。後來就是在二分查找後,加上了下面這兩個語句。
if(x<a[l]) cout<<l-1<<" "<<l;//以a[l]爲界,若是x在a[l]左邊,那麼輸出l以及l+1
if(x>a[l]) cout<<l<<" "<<l+1;//若是x在a[l]左邊,那麼輸出l-1以及l
我以爲咱們在作題的時候,不能只是將題目完成了就好,要好好思考怎麼將代碼變得簡潔及時間、空間複雜度降到最優,這也是算法課存在的意義。打題仍是要多思考,多嚴格要求本身,不能想着投機取巧,單純完成題目就好。
而後對上機打題的體驗感很好,能夠和組員一塊兒思考,一塊兒討論,共同完成題目的感受挺好的。