二分查找

二分查找(Binary Search)又称折半查找,它是一种效率较高的查找方法

二分查找要求:线性表是有序表

1. 首先确定该区间的中点位置

mid = (left + right) / 2

2. 然后将待查的key值与arr[mid]比较: 若相等, 则查找成功并返回此位置, 否则须确定新的查找区间, 继续二分查找,具体方法如下:

    若arr[mid]>key, 则由表的有序性可知arr[mid..right]均大于key, 因此若表中存在关键字等于key的结点, 则该结点必定是在位置mid左边的子表arr[left..mid-1]中, 故新的查找区间是左子表arr[left..mid-1]

    若arr[mid]<key, 则要查找的key必在mid的右子表arr[mid+1..right]中, 即新的查找区间是右子表arr[mid+1..right]

因此, 从初始的查找区间arr[left..right]开始, 每经过一次与当前查找区间的中点位置上的结点关键字的比较, 就可确定查找是否成功, 不成功则当前的查找区间就缩小一半. 这一过程重复直至找到为key的结点, 或者直至当前的查找区间为空(即查找失败)时为止

二分查找递归算法

 public int binarySearch(int key, int left, int right) {
  int mid = (left + right) / 2;
  int temp = arr[mid];
  if (left > right) {// 当前查找区间arr[left..right]为空
   return -1;
  } else if (key == temp) {// 刚好找到为key所在下标
   return mid;
  } else if (key > temp) {// arr[mid]>key, 递归查找左子表arr[left..mid-1]
   return binarySearch(key, mid + 1, right);
  } else if (key < temp) {// arr[mid]<key, 递归查找右子表arr[mid+1..right]
   return binarySearch(key, left, mid - 1);
  }
  return -1;
 }

    二分查找非递归算法

public int binarySearch(int key, int left, int right) {
  while (left <= right) {// 当前查找区间arr[left..right]非空
   int mid = (left + right) / 2;
   if (arr[mid] == key) {// 刚好找到为key所在下标
    return mid;
   } else if (arr[mid] > key) {// arr[mid]>key, 新的查找区间是左子表arr[left..mid-1]
    right = mid - 1;
   } else if (arr[mid] < key) {// arr[mid]<key, 新的查找区间是右子表arr[mid+1..right]
    left = mid + 1;
   }
  }
  return -1;
 }

你可能感兴趣的:(二分查找,递归,非递归,折半查找)