折半查询
实现思路:
折半查询是从一组已经排好序的数组中搜索目标数的为止;首先要从数组中找到中间数,然后判断该数是否是需要查询的数,如果是,则确定找到该数,否则继续找到中间数,重复操作,直到查询完所有数组或者找到需要找到的数字,但是需注意要的是即使数组中有多个相同数据,也只会返回一个数。
package com;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
// 折半查询: 数组必须有序
// 随机生成一个测试数组
int[] buf = new int[100];
for (int i = 0; i < buf.length; i++) {
buf[i] = i / 3;
}
// 排序方法,可以进行数组的排序
Arrays.sort(buf);
// 输出数组中的所有内容
System.out.println(Arrays.toString(buf));
// 完成折半查询
System.out.println(binaryQuery01(buf, 7));
System.out.println(binaryQuery(buf, 7));
}
// 循环实现
public static int binaryQuery01(int[] buf, int number) {
// 开始位置
int sta = 0;
// 结束位置
int end = buf.length - 1;
// 中间位置
int index = (sta + end) / 2;
while (sta <= end) {
index = (sta + end) / 2;
if (buf[index] == number) {
return index;
} else if (buf[index] < number) {
sta = index + 1;
} else {
end = index - 1;
}
}
return -1;
}
public static int binaryQuery(int[] buf, int number) {
return binaryQuery(buf, number, 0, buf.length - 1);
}
// 递归实现
public static int binaryQuery(int[] buf, int number, int sta, int end) {
// 中间位置
int index = (end + sta) / 2;
if (buf[index] == number) {
return index;
} else if (buf[index] < number && index + 1 <= end) {
return binaryQuery(buf, number, index + 1, end);
} else if (buf[index] > number && index - 1 >= sta) {
return binaryQuery(buf, number, sta, index - 1);
}
return -1;
}
}