二分法:(二分法不是只能做数组,这里的数组只是为了举例)

在给出的有序排列的数组中,把目标值和数组中间值进行比较,如果相等,则返回中间值下标,如果目标值小于中间值,就从数组的前半段再次执行二分法查找,如果目标值大于中间值,从数组的后半段开始二分法查找

二分法查找主要是比较的次数少,查找的速度快,平均性能好,但是待查表一定要是有序的,插入删除比较困难,所以二分法查找不适用于经常变动的有序列表.

上代码:

 1 package cn.summerchill.sort;
 2
 3 public class BinarySearch {
 4     public static void main(String[] args) {
 5         //有序排列数组(大到小,小到大无所谓)
 6         int[] array = {1,2,3,4,5,6,7,8,9,10};
 7         //打印二分法的返回值
 8         System.out.println(searchRecursive(array,0,array.length-1,9));
 9     }
10     public static int searchRecursive(int[] array,int start,int end,int findValue){
11         if(array==null){
12             return -1;
13         }
14         if(start<=end){
15             //中间位置
16             int middle = (start + end)/2;
17             //中值
18             int middleValue = array[middle];
19             if(findValue == middleValue){
20                 //与中值相等就直接返回
21                 //return middle;
22                 return middleValue;
23             }else if(findValue < middleValue){
24                 //目标值小于中值,在中值前面找(这里调用了二分法的方法)
25                 return searchRecursive(array,start,middle - 1,findValue);
26             }else {
27                 //目标值大于中值,在中值后面找(这里调用了二分法的方法)
28                 return searchRecursive(array,middle + 1,end,findValue);
29             }
30         }else{
31             //返回-1,查找失败
32             return -1;
33         }
34     }
35 }

======================2017-10-22晚添加========

自己写二分法:

 1 public class BinarySearch {
 2     public static void main(String[] args) {
 3         Integer arr[] = { 1, 2, 4, 6, 8, 11, 23 };
 4         binarySearch(arr,0,arr.length - 1, 23);
 5     }
 6     public  static void binarySearch(Integer[] arr,int start, int end, int num){
 7         if(arr != null && arr.length > 0){
 8             int middle = (end + start) / 2;
 9             //中间的值大于目标值
10             /*
11              一开始我处理的方式是 end = middle; start = middle
12              这样在查找最后一个元素的时候容易造成栈溢出 StackOverFlow
13             因为查找最后一个元素的时候 (index-1  + index)/2 永远比index 小,找不到最后一个元素
14             需要对 end - start == 1 做一个单独的判断.
15             但是如果 end = middle -1 ; start = middle + 1 这种形式就没有问题了.
16              */
17             if(arr[middle] > num){
18                 end = middle - 1;
19                 binarySearch(arr, start, end, num);
20             }else if(arr[middle] < num){//中间的值小于目标值
21                 start = middle + 1;
22                 binarySearch(arr, start, end, num);
23             }else{//和中间的值相等
24                 System.out.println("找到对应的值,值为:" + num);
25             }
26         }
27     }
28 }

Java实现二分法排序相关推荐

  1. java利用二分法进行排序

    排序算法传送: 排序算法--java实现冒泡排序 排序算法--java实现选择排序 排序算法--java实现直接插入排序 排序算法--java实现二分法排序 排序算法--java实现希尔排序 排序算法 ...

  2. java二分法排序算法_Java中使用二分法排序

    在数据结构中学习过关于二分法排序的算法,但都是基于C语言或者C++使用指针的方法,自己因为要在项目中使用到此算法,才开始将原有的程序改写为Java语言的.具体的说明如下: 1.二分法查找插入位置 如果 ...

  3. java二分法排序_二分法排序讲解『附视频』

    二分法排序讲解『附视频』 时间:2017-06-22     来源:华清远见JAVA学院 算法一直是Java编程学习中的重点和难点,今天华清Java学院小编就和大家分享一下Java中的二分法排序. ① ...

  4. 帮我找一个用Java写的二分法排序代码

    这是一个使用 Java 语言实现二分法排序的示例代码: import java.util.Arrays;public class BinarySort {public static void main ...

  5. java 怎么自定义排序_Java如何实现List自定义排序

    Java如何实现List自定义排序,自定义,即为,详细内容,相关文章,更多关于 Java如何实现List自定义排序 易采站长站,站长之家为您整理了Java如何实现List自定义排序的相关内容. 实体类 ...

  6. 分享一个多线程实现[冒泡][选择][二分法]排序的例子

    线程的使用规则我将会在我另一篇文章<Delphi中使用比较少的一些语法>中进行介绍,这里只开放一篇Delphi原代码的算法: //工程文件:Sort_MultiThread.dpr pro ...

  7. java中自然排序和比较器排序

    这里所说到的Java中的排序并不是指插入排序.希尔排序.归并排序等具体的排序算法.而是指执行这些排序算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样 ...

  8. java List实体排序

    对于java实体集合排序这里总结了三种方法,第一种是通过原生支持的Comparator做排序,第二种是通过java8的Lambda表达式进行排序,第三种是使用apache-common的工具包进行排序 ...

  9. android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些

    学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...

最新文章

  1. oracle 格式化报表输出,perl的格式化(Format)报表输出实现代码
  2. Myeclipse中weblogic配置
  3. 安装完mysql后sqlserver_您还在用下一步下一步的方式安装SQLSERVER和SQLSERVER补丁吗?...
  4. 画瀑布图_常见的招财风水画之含义
  5. 【短语学习】盈余量分析(earned value analysis)
  6. Cocos2D 添加 UIView
  7. JDK源码解析之 java.lang.System
  8. 排队接水(洛谷-P1223)
  9. 将Visual Studio Code和Windows Subsystem for Linux一起使用
  10. 钉钉日志范文100篇_钉钉的日志模板怎么修改 钉钉日志模板修改教程
  11. 漏洞扫描工具有哪些_5.4k Star!简单又全面的容器漏洞扫描工具:Trivy
  12. [转载] c++的vector赋值方法汇总
  13. 奇怪的ISA服务停止故障
  14. 机器学习之BP算法推导
  15. 全志A33_Vstar
  16. 凌晨起来肝的一篇 Java 学习路线,保证学弟学妹们大三大四的时候顺利找到实习 Offer
  17. 原子互换:一统公链江湖的神来之笔
  18. js事件冒泡、阻止事件冒泡以及阻止默认行为
  19. PHPStorm 显示自动换行
  20. Kafka创建topic

热门文章

  1. 方程式工具包Linux,NSA工具包验证之SMB漏洞利用
  2. FFMPEG实现PCM编码(采用封装格式实现)
  3. 原生js信息提示框(非dialog)
  4. Redis(11)----Redis客户端
  5. WEB入门二 表格和表单
  6. Java实现在线打开编辑保存PPT
  7. 大屏---适配比例缩放--视频播放完路由自动切换
  8. springboot整合mina
  9. vue admin后台管理系统快速开发源码/模板文档
  10. string教程c语言,C++ string类详解