版权申明
- 本文原创作者:是飘飘呀!
- 作者博客地址:https://blog.csdn.net/weixin_44216392
二分查找(折半查找)
什么叫二分查找呢?我们先来看下百科咋说的:
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列;
我们这里就用数组实现,且数组需要按照小到大的顺序排序,才能找到准确的位置,这里可能有同学要说了,就算是乱序的数组,也可以先进行排序再查找,但是这样找出来的还是他原本的位置吗?显然不是;
那就先举个栗子吧,比如我们要进行一个猜价格的小游戏,这个价格在100到200之间,而通常我们会怎么比较快速的找到准确的价格呢?那我们就先猜个150;如果小了那我们第二次猜就用该在151到200之间去猜;如果大了呢,那就应该在100到149之间找;第三种情况,刚好150就是我们要找的数,那此时前面的两种情况我们都不需要再去考虑了…说了半天不如直接上手代码;
package com.etime1;
import java.util.Scanner;
public class BinarySearch {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入你要查找的数:");
int[] intArray = { 0, 2, 5, 6, 8, 9, 15, 25, 30 };
int value = scan.nextInt();
BinarySearch search = new BinarySearch();
int binarySearch = search.binarySearch(intArray, value);
if (binarySearch != -1) {
System.out.println("您要查找的数是" + value + "它的位置是:" + binarySearch);
} else {
System.out.println("数组中没有您要查找的数" + value);
}
scan.close();
}
public int binarySearch(int[] intArray, int value) {
int max = intArray.length - 1;
/*
* 在此处最大值等于数组长度减1,因为数组的索引值是从0开始
* 最大值就用该等于数组的最后一个元素,而它的索引值就是数组长度length-1
* 如果不减一就会出现数组索引越界异常
*/
int min = 0; //那么最小值就是0啦
int mid = (max + min) / 2;
//当value不等于中间值时才判断;
while (intArray[mid] != value) {
//第一种情况
if (intArray[mid] < value) {
min = mid + 1;
//第二种情况
} else if (intArray[mid] > value) {
max = mid - 1;
}
mid = (max + min) / 2;
//如果最小值大于最大值就直接返回-1
if (min > max) {
return -1;
}
}
//最后直接返回mid的值
return mid;
}
}
最后我们看一下运行结果:
最后,注释写得有点多,希望各位不要吐槽哦。哈哈,这两天在学前端的内容,学得是一头雾水啊,是不是我太菜了,ajax、jQuery、bootstrap框架…我太难了。
内容可能有一些不太正确的地方,特别是举的栗子可能不太行性形象,嘿嘿嘿,希望各位能够指正,我这java菜鸟的进阶之路还太远啊。。