1 /* 2 二分法實驗 3 1、設a[0:n-1]是一個已排好序的數組. 4 請改寫二分搜索算法,使得當搜索元素x不在數組中時, 5 返回小於x的最大元素的位置I和大於x的最大元素位置j. 6 當搜索元素在數組中時,I和j相同,均為x在數組中的位置. 7 2、設有n個不同的整數排好序后存放於t[0:n-1]中, 8 若存在一個下標I,0<=i<n,使得t[i]=i, 9 設計一個有效的算法找到這個下標. 10 要求算法在最壞的情況下的計算時間為O(logn). 11 */ 12 #include<iostream> 13 using namespace std; 14 /* 15 功能:1\二分查找改進版 16 輸入:拍好序的a[],大小n,待查數x,返回參數i,j 17 返回:真:找到 18 */ 19 bool BinarySearch(int *a,int n,int x,int& i,int& j){ 20 int left=0; 21 int right=n-1; 22 while(left<=right){ 23 int mid=(left+right)/2; 24 if(x==a[mid]){ 25 i=j=mid; 26 return true; 27 } 28 if(x>a[mid]) 29 left=mid+1; 30 else 31 right=mid-1; 32 } 33 i=right; 34 j=left; 35 return false; 36 } 37 /* 38 功能:2\高效查找 39 輸入:數組,大小,待查值 40 返回:下標,若沒有返回-1 41 */ 42 int SearchTag(int *a,int n,int x){ 43 int left=0; 44 int right=n-1; 45 while(left<=right){ 46 int mid=(left+right)/2; 47 if(x==a[mid]) return mid; 48 if(x>a[mid]) 49 left=mid+1; 50 else 51 right=mid-1; 52 } 53 return -1; 54 } 55 int main(){ 56 int n,i,j,a[1000],x; 57 while(cin>>n){//輸入數組大小 58 for(i=0;i<n;i++)cin>>a[i];//輸入數據,需要從小到大 59 cin>>x;//輸入待查數據 60 BinarySearch(a,n,x,i,j);//超找 61 cout<<"用函數1找到的i,j為: "<<'('<<i<<','<<j<<')'<<'\n';//輸出對應的i,j 62 cout<<"用函數2找到的下標為: "<<SearchTag(a,n,x)<<"\n\n";//輸出2找到的下標 63 }return 0; 64 }
