二分查找

一:二分查找定義:

二分查找又稱折半查找,優勢是比較次數少,查找速度快,平均性能好;其缺點是要求待查表爲有序表,且插入刪除困難。所以,折半查找方法適用於不常常變更而查找頻繁的有序列表。
首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,若是二者相等,則查找成功;不然利用中間位置記錄將表分紅前、後兩個子表,若是中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,不然進一步查找後一子表。重複以上過程,直到找到知足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。 ——百度百科數組

二:二分查找基本操做:

一、找到該值在數組中的下標

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;
}

二、查找第一個與\(x\)相等的元素在數組中下標

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;
}

三、查找最後一個與\(x\)相等的元素在數組中下標

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;
}

四、查找最後一個小於\(x\)的元素下標

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的最右邊元素下標。

五、查找第一個大於等於\(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的最左邊元素下標。

六、查找第一個大於\(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;
}

有寫錯的地方歡迎糾正,有什麼不懂的地方能夠留言問我 \(QwQ\)~

相關文章
相關標籤/搜索