今天上csdn,发现一篇关于二分查找算法的文章被置顶,回帖也相当热烈。我觉得算法总重要的还是要了解思想,至于编程技巧则是其次。 二分查找在计算中算法中的重要性不言而喻,许多变形的算法都是基于此演变的,比如二分查找树等。 所以此算法程序我也打算总结一下。 当然经典的算法讨论莫过于Jon Bentley 的编程珠玑了。
1, 可能溢出的算法
int buggyBinarySearch(int[] a, int target) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = (low + high) / 2; ///此处有个bug,可能会溢出,所以接下来的两个程序可以解决这个问题
int midVal = a[mid];
if (midVal < target)
low = mid + 1;
else if (midVal > target)
high = mid - 1;
else
return mid;
}
return -1;
}
2,一般二分算法
int BinarySearch(int[] a, int target) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = low + (high-low)>>1
int midVal = a[mid];
if (midVal < target)
low = mid + 1;
else if (midVal > target)
high = mid - 1;
else
return mid;
}
return -1;
}
3。 采用无符号左移
int BinarySearch(int[] a, int target) {
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = (high+low)>>>1
int midVal = a[mid];
if (midVal < target)
low = mid + 1;
else if (midVal > target)
high = mid - 1;
else
return mid;
}
return -1;
}