1.二分查找介绍
二分查找也叫折半查找,首先计算数组中间的位置(元素个数除以2),将数组中间位置处的下标与查找的元素进行比较,如果相等,则查找成功;否则利用中间位置将数组分为左、右两个部分,如果中间位置的下标大于查找的元素,则查找左子表,否则查找右子表。重复上面的过程,直到找到要查找的关元素为止,否则查找失败不存在此元素。
2. 查找的思路
2.1 mid小于要找的元素
2.2 mid大于要找的元素
3. 二分查找优缺点
- 优点是比较次数少,查找速度快,平均性能好;
- 其缺点是要求待查表为有序表,且插入删除困难。
- 因此二分查找方法适用于不经常变动而查找频繁的有序列表。
使用条件:查找序列是顺序结构,有序。
4.代码实现
/**
* @project 二分查找
**/
public static int binarysearch(int[] array, int k) {
int sz = array.length;//求数组长度
int left = array[0];//左下标
int right = sz - 1;//右下标
while (left <= right) {
int mid = (left + right) / 2;//中间下标
if (array[mid] > k) {//要找的元素在左边
right--;
} else if (array[mid] < k) {//要找的元素在右边
left++;
} else {//找到了返回下标
return mid - 1;//下标是从0开始的,每一个元素的下标都是 n-1
}
}
return -1;
}
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
//int k = 7;//查找的元素
Scanner input = new Scanner(System.in);
System.out.print("输入要查找的元素:");
int k = input.nextInt();//输入要查找的元素
int ret = binarysearch(array, k);
/**
* @rule 返回1说明找到了 - 返回-1说明没找到
* @rule 输出找到元素的下标
**/
if (-1 == ret) {
//找不到
System.out.println("找不到,因为元素不存在");
} else {
System.out.println("找到了,下标是:" + array[ret]);
}
}