二分查找又稱折半查找,優勢是比較次數少,查找速度快,平均性能好;其缺點是要求待查表爲有序表,且插入刪除困難。所以,折半查找方法適用於不常常變更而查找頻繁的有序列表。
首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,若是二者相等,則查找成功;不然利用中間位置記錄將表分紅前、後兩個子表,若是中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,不然進一步查找後一子表。重複以上過程,直到找到知足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。 ——百度百科數組
inline int find1(int *a, int x) { int l=1,r=n; while(l<=r) { int mid=(l+r)>>1; if(a[mid]==x) return mid; else if(a[mid]<x) l=mid+1; else r=mid-1; } return -1; }
inline int find2(int *a, int x) {。 int l=1,r=n; while(l<=r) { int mid=(l+r)>>1; if(a[mid]>=x) r=mid-1; else l=mid+1; if(l<=n&&a[l]==x) return l; } return -1; }
inline int find3(int *a, int x) { int l=1,r=n; while(l<=r) { int mid=(l+r)>>1; if(a[mid]<=x) l=mid+1; else r=mid-1; if(r>=1&&a[r]==x) return r; } return -1; }
inline int find4(int *a,int x) { int l=1,r=n; while(l<=r) { int mid=(l+r)>>1; if(a[mid]>=x) r=mid-1; else l=mid+1; } return r; } //查找最後一個小於x的元素,也就是說返回小於x的最右邊元素下標。
inline int find5(int *a,int x) { int l=1,r=n; while(l<=r) { int mid=(l+r)>>1; if(a[mid]>=x) r=mid-1; else l=mid+1; } return l; } //查找第一個等於或者大於x的元素,也就是說等於查找x值的元素有好多個 //返回這些元素最左邊元素下標若是沒有等於x值的元素,則返回大於x的最左邊元素下標。
inline int find6(int *a,int x) { int l=1,r=n; while(l<=r) { int mid=(l+r)>>1; if(a[mid]>x) r=mid-1; else l=mid+1; } return l; }