二分法查詢(折半查詢)
阿新 • • 發佈:2019-01-06
一、二分法查詢思想
- 首先從陣列的中間mid開始查詢,如果剛好等於要查詢的值,則返回這個數字的所在位置。
- 如果要查詢的數字比mid值小,則讓mid-1,做為陣列的右邊界,重複(1)操做;如果要查詢的數字比mid大,則讓mid+1做為陣列的左邊界,重複(1)操作。
- 如果left=right時,還沒有找到該數字,則此數字不存在於這個陣列當中。
如圖:
二、二分法查詢的前提條件
- 必須是順序表
- 順序表中的數字必須有序
三、程式碼實現
第一種:非遞迴實現 時間複雜度為O(log2^n)
#include<stdio.h> int Searchval(int *arr,int n,int val) { int pos=-1; if(arr==NULL||n<=0) { return pos; } int left=0;right=n-1; while(right>=left) { int mid=(right-left)/2+left;防止溢位 if(arr[mid]>val) { right=mid-1; } else if(arr[mid]<val) { left=mid+1; } else { while(right>left&&val=arr[mid-1]) mid--; break; } } return pos; } int main() { int arr[]={0,0,1,2,2,3,4,5,6,7,8,9}; int n=sizeof(arr)/sizeof(arr[0]); int pos=FindVal(arr,n,7); printf("%d\n",pos); return 0; }
第二種:遞迴演算法
#include<stdio.h> int Search(int *arr,int left,int right,int val) { int pos=-1; if(right>=left) { int mid=(right-left)/2+left; if(val>arr[mid]) { pos=Search(arr,mid+1,right,val); } else if(val<arr[mid]) { pos=(arr,left,mid-1,val); } else { while(mid>left&&val=arr[mid-1]) --mid; pos=mid; } } return pos; } int SearchVal(int *arr,int n,int val) { int pos=-1; if(arr==NULL||n<=0) return pos; return SearchVal(arr,0,n-1,val); } int main() { int arr[]={0,0,1,2,2,3,4,5,6,7,8,9}; int n=sizeof(arr)/sizeof(arr[0]); int pos=SearchVal(arr,n,2); printf("%d\n",pos); return 0; }