二分查找

二分查找(Binary Search)又稱折半查找,它是一種效率較高的查找方法java


二分查找要求:線性表是有序表算法

算法思想:spa

1. 首先肯定該區間的中點位置code

mid = (left + right) / 2遞歸

2. 而後將待查的key值與arr[mid]比較: 若相等, 則查找成功並返回此位置, 不然須肯定新的查找區間, 繼續二分查找,具體方法以下:class

    若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的結點, 或者直至當前的查找區間爲空(即查找失敗)時爲止while


二分查找遞歸算法實現:co

 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;
 }
相關文章
相關標籤/搜索