遞迴程式碼
int binary_search(int arr[],int left,int right,int key){ if (left>right){//區間無效 return -1; } int mid=left+(right-left)/2; //直接平均可能會溢位 if(arr[mid]==key){ return mid; }else if(key>arr[mid]){ return binary_search(arr,mid+1,right,key); //右半區間繼續查詢 } else{ return binary_search(arr,left,mid-1,key); //左半區間繼續查詢 } }
迴圈程式碼
//程式碼中 arr 表示陣列,left 表示區間左邊界, right 表示區間右邊界,mid 表示中間位置 int binary_search(int arr[],int left,int right,int key){ int ret=-1;//未搜尋到資料返回-1 int mid;//中間位置 while(left<=right){//只要區間有效就繼續 mid=left+(right-left)/2; //直接平均可能會溢位 if(arr[mid]==key){ ret=mid;//找到 break; } else if(key>arr[mid]){//右半區間繼續查詢 left=mid+1; } else{ right=mid-1; //左半區間繼續查詢 } } return ret; // 返回結果 }
1
#include<iostream> using namespace std; int main(){ int a[5]={1,2,2,3,4}; int n; cin>>n; int l=0,r=4; int m; while(l<=r){ m=l+(r-l)/2; if(a[m]>=n){ r=m-1; }else{ l=m+1; } if(a[l]==n){ cout<<l; return 0; } } cout<<-1; }
2
#include<iostream> using namespace std; int main(){ int a[5]={1,2,2,3,4}; int n; cin>>n; int l=0,r=4; int m; while(l<=r){ m=l+(r-l)/2; if(a[m]>n){ r=m-1; }else{ l=m+1; } if(a[r]==n){ cout<<r; return 0; } } cout<<-1; }
3
#include<iostream> using namespace std; int main(){ int a[9]={1,4,5,8,10,10,12,13,15}; int n; cin>>n; int l=0,r=8; int m; while(l<=r){ m=l+(r-l)/2; if(a[m]>=n){ r=m-1; }else{ l=m+1; } if(a[l]>=n){ cout<<l; return 0; } } cout<<-1; }
4
#include<iostream> using namespace std; int main(){ int a[9]={1,4,5,8,10,10,12,13,15}; int n; cin>>n; int l=0,r=8; int m; while(l<=r){ m=l+(r-l)/2; if(a[m]>n){ r=m-1; }else{ l=m+1; } if(a[r]<=n){ cout<<r; return 0; } } cout<<-1; }