二分查找
折半查找過程可用二叉樹來描述,把有序表中間位置上的結點作為樹的根結點,左子表和右子表分別對應樹的左子樹和右子樹。折半查找的過程就是走一條從根節點到被查結點的一條路徑,比較的次數就是該路徑中結點的個數,即,該結點在樹中的層數。 深度為K的二叉樹最多有2的K次方-1個結點,深度為7的二叉樹最多有127個結點.
代碼
public class BinarySearch {
public static int noRecursion(int[] arr, int key, int low, int high) {
while (low < high) {
int mid = (low + high) >>> 1;
int sortNum = arr[mid];
if (key > sortNum) {
low = mid + 1;
} else if (key < sortNum) {
high = mid - 1;
} else {
return mid;
}
}
return -1;
}
public static int recursion(int[] arr, int key, int low, int high) {
int mid = (low + high) >>> 1;
int sortNum = arr[mid];
int res = -1;
if (key > sortNum) {
res = recursion(arr, key, mid + 1, high);
} else if (key < sortNum) {
res = recursion(arr, key, low, mid - 1);
} else {
return mid;
}
return res;
}
}
復雜度
image.png
整個有序表可以生成深度為多少的二叉樹
int TestBinSearch(int first, int end)
{
if(first < end)
{
int mid = (first + end) / 2;
int numOfLeftCmp = TestBinSearch(first, mid - 1);
int numOfRightCmp = TestBinSearch(mid + 1, end);
if(numOfLeftCmp > numOfRightCmp)
return numOfLeftCmp + 1;
else
return numOfRightCmp + 1;
}
else if(first == end)
return 1;
else
return 0;
}