標籤:靈活 return 解決 問題 資源 iostream == 整數 大致
1、實踐題目:7-1
2、問題描述:使用二分尋找演算法在n個非降序排列的整數中尋找x,輸出x所在的下標(0~n-1)及比較次數。若x不存在,輸出-1和比較次數。
3、演算法描述:將n個元素分成個數大致相同的兩半,取a[mid]與x比較。如果x=a[mid],則找到x,演算法終止;如果x<a[mid],則只在數組a的左半部繼續尋找x,如果x>a[mid],則只在a的右半部繼續搜尋x。同時,在while語句裡加一個b統計比較次數。
4、代碼如下:
1 #include<iostream> 2 using namespace std; 3 int BinarySearch(int a[],int left,int right,int x,int &b){ 4 while (left<=right){ 5 b++; 6 int middle =(left+right)/2; 7 if (x==a[middle]){ 8 return middle; 9 }10 if(x>a[middle]){11 left=middle+1;12 }13 else {14 right =middle-1;15 } 16 }17 return -1;18 }19 int main(){20 int n,x,b=0;21 cin>>n;22 int a[1000];23 for (int i=0;i<n;i++){24 cin>>a[i];25 }26 cin>>x;27 int index=BinarySearch(a,0,n-1,x,b);28 cout<<index<<endl<<b;29 }
5、時間複雜度和空間複雜度:用了二分法搜尋演算法,尋找x的時間複雜度為O(logn);空間複雜度為數組空間大小,是一個常數,與變數n的取值無關。所以空間複雜度為O(1)。
6、心得體會:要靈活地運用學過的代碼,將它們靈活地嵌入要解決的問題中。在解決問題時,要多考慮到最優解,也就是時間複雜度最小的解法,這有利於使演算法更便捷,資源更能合理的運用。
第二章上機實驗報告