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

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

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

上代码:

 package cn.summerchill.sort;

 public class BinarySearch {
public static void main(String[] args) {
//有序排列数组(大到小,小到大无所谓)
int[] array = {1,2,3,4,5,6,7,8,9,10};
//打印二分法的返回值
System.out.println(searchRecursive(array,0,array.length-1,9));
}
public static int searchRecursive(int[] array,int start,int end,int findValue){
if(array==null){
return -1;
}
if(start<=end){
//中间位置
int middle = (start + end)/2;
//中值
int middleValue = array[middle];
if(findValue == middleValue){
//与中值相等就直接返回
//return middle;
return middleValue;
}else if(findValue < middleValue){
//目标值小于中值,在中值前面找(这里调用了二分法的方法)
return searchRecursive(array,start,middle - 1,findValue);
}else {
//目标值大于中值,在中值后面找(这里调用了二分法的方法)
return searchRecursive(array,middle + 1,end,findValue);
}
}else{
//返回-1,查找失败
return -1;
}
}
}

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

自己写二分法:

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

Java实现二分法排序的更多相关文章

  1. java简单的二分法排序

    二分法排序的思路:数据元素要按顺序排列,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于当前位置值,则在数列的前半段中查找:若 x 大于当前位置值则在数列的后 ...

  2. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  3. [No000087]Linq排序,SortedList排序,二分法排序性能比较

    using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...

  4. [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)

    冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...

  5. Java中的排序算法(2)

    Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...

  6. Java实现常见排序算法

    常见的排序算法有冒泡排序.选择排序.插入排序.堆排序.归并排序.快速排序.希尔排序.基数排序.计数排序,下面通过Java实现这些排序 1.冒泡排序 package com.buaa; import j ...

  7. js 排序:sort()方法、冒泡排序、二分法排序。

    js中的排序,这里介绍三种,sort()方法.冒泡排序.二分法排序. 1.sort方法 写法:  数组.sort(); 返回排好序的数组,如果数组里是数字,则由小到大,如果是字符串,就按照第一个字符的 ...

  8. Comparable与Comparator,java中的排序与比较

    1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...

  9. Java之List排序出错

    Java之List排序出错 Bound mismatch: The generic method sort(List<T>) of type Collections is not appl ...

随机推荐

  1. 哪些优秀的 Windows 小工具,类似 clover 或 everything

    有哪些优秀的 Windows 小工具,类似 clover 或 everything? 目前已知的有everything, listary, total commander, clover, dexpo ...

  2. 好文推荐系列--------(3)GruntJS 在线重载 提升生产率至新境界

    好文原文地址:http://segmentfault.com/a/1190000000354555 本文将首先介绍grunt-markdown插件如何配合HTML模板使用,接着我将介绍如何使用grun ...

  3. mac终端的命令都失效的解决方法

    step1. 在terminal里面输入: export PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin&qu ...

  4. x11 VNC远程桌面

    Ubuntu远程桌面,类似于qq远程桌面(Ubuntu没有内置桌面系统吗?) $ sudo apt-get update $ sudo apt-get install x11vnc $ x11vnc ...

  5. 04:第一个OC类

    1.类与对象的关系 面向对象的核心就是对象,那怎么创建对象? OC中创建对象比较复杂, 首先要理解一个概念叫做类. 现实生活中是根据一份描述,一份模板创建对象,编程语言也一样,也必须先有一份描述,在这 ...

  6. 12.equals()方法总结

    超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: 我们知道所有对象都有表示(内存地址)和状态(数据),看上面代码是用"=="来比 ...

  7. bootstrap2.1相关文档

    本节课我们主要学习一下 Bootstrap表格和按钮功能,通过内置的 CSS定义,显示各种丰富的效果. 一.表格 Bootstrap提供了一些丰富的表格样式供开发者使用. 1.基本格式 //实现基本的 ...

  8. ASP.NET Web API 框架研究 Controller创建 HttpController 类型解析 选择 创建

    上一篇介绍了HttpController的一些细节,接下来说下HttpController 类型解析.选择和创建.生产HttpController实例的生产线如下图: 一.涉及的类及源码分析 涉及的类 ...

  9. spring mvc 的请求流程

    SpringMVC核心处理流程: 1.DispatcherServlet前端控制器接收发过来的请求,交给HandlerMapping处理器映射器 2.HandlerMapping处理器映射器,根据请求 ...

  10. IIS日志存入数据库之一:ODBC

    园内@Fish Li的文章<IIS日志-网站运维的好帮手>中介绍将IIS的文本格式的文件导入数据库的方法.在实践中,我们发现导数据的速度很慢,一个200M的日志文件居然要近100分钟.我们 ...