"二分法"-"折半法"-查找算法-之通俗易懂,图文+代码详解-java编程
2016-06-08 21:22
337 查看
1.特点及概念介绍
下面给大家讲解一下"二分法查找"这个java基础查找算法,那么什么是二分法呢?其实所谓的"二分法",就是一分为二的意思,综合起来理解就是一分为二的查找,但大家记住了,二分法是建立在"已经按顺序排好"的基础条件上,如果大家把这个二分法查找理解清楚了,那么会有助于你更好的理解快速排序,下面我就罗列出该算法的特点: 1.定义起始位置start(0角标),定义末位置end(lenght-1位置,即最后一位) 2.无限循环的查找一个值,先看看该值是不是在中间mid角标,mid=(star+end)/2 3.如果该值大于mid角标对应值,那么start变成mid的右边一位,如果小于,那么end就变成mid的左边一位,这样会极其的高效. 5.找到值就返回值或打印,找不着也返回-1或打印,并停止循环.
2.图文描述过程
现有需求:
1.有一个已经排列好顺序的从小到大的数组. 2.请查询一个数字所在的角标位置. 3.如果元素不存在,请给出如果插入,那么应该插入的位置.
3.代码详情
public class Demo04 { public static void main(String[] args) { int[] ints = { 1, 3, 5, 7, 9, 11, 14 }; find(ints, 3); find(ints, 14); find(ints, 6); } /** * 如果找不到,那么求应该插入的位置 */ private static void find(int[] ints, int i) { // int index = Arrays.binarySearch(ints, i); // System.out.println(index);//找不到返回负数 int start = 0; int end = ints.length - 1; while (true) { int mid = (start + end) / 2; // 注意中间是两者之和的一半 if (i == ints[mid]) { System.out.println("index = " + mid);// 正好找到打印角标,停止; break; } else { if (i < ints[mid]) {// 小于中间值,那么end变成中间往中间往左一位 end = mid - 1; } else {// 大于则相反 start = mid + 1; } } // 交叉了-即找不到情况,说明start在0或者尾部或者在交叉时的前一位,那么得到应该插入位置; if (start > end) { // 找到了前面一个start,并确定在此即可; System.out.println("no find, will insert in :" + start); break; } } }
输出结果(分别找3,找14,找6)
index = 1 index = 6 no find, will insert in :3
4.总结:
二分法查找,又称折半查找,大家需要记住的重点有1.已经排序好的数组 2.确定最左边的start,最右边的end 3.无限循环当中找mid角标对应的值,start和end会根据情况改变 4.当发现start和end交叉,那么证明找不到,即如果放入该元素,那么就应该放在此时的start位置.
这就是今天给大家讲的二分(折半)查找算法,希望能帮组大家快速的理解清楚.
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树