二分查找(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; }