二分查找(java实现)
二分查找
算法思想:又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。
实现:
1.非递归代码
//传入数组及要查找的数字
private static int searchNumber(int[] array, int searchValue) {
if (array == null)
return -1;
int start = 0;
int end = array.length - 1;
int mid = 0;
while (start <= end) {
// 每次取中间位置进行查找
mid = (start + end) / 2;
if (searchValue < array[mid]) {
end = mid - 1;
} else if (searchValue > array[mid]) {
start = mid + 1;
} else {
return mid;
}
}
return -1;
}
//递归实现
private static int searchRecursion(int[] array, int start, int end, int searchValue) {
if (array == null)
return -1;
if (start <= end) {
// 每次取中间位置进行查找
int mid = (start + end) / 2;
if (searchValue < array[mid]) {
return searchRecursion(array, start, mid - 1, searchValue);
} else if (searchValue > array[mid]) {
return searchRecursion(array, mid + 1, end, searchValue);
} else {
return mid;
}
}
return -1;
}时间复杂度为 O(logN)
查找第一个元素出现的位置(元素允许重复)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
查询元素最后一次出现的位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|