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

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

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

上代码:

 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. centos7 新增ip

    1.进入network-scripts目录:cd /etc/sysconfig/network-scripts/ 2.复制ifcfg-eth0: cp ifcfg-eth0 ifcfg-eth0:0 ...

  2. math.net 拟合

    参考:http://blog.csdn.net/ztmsimon/article/details/50524392 在论坛中总看到有人在说Math.NET Iridium,查了一下,现在被整合到Mat ...

  3. poj 1094 Sorting It All Out 拓补排序

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  4. FoonSunCMS-Word图片上传功能-Xproer.WordPaster

    1.1. 与FoosunCMS 3.1.0930整合 基于WordPaster-asp-CKEditor4.x示例 下载地址:http://www.ncmem.com/download/WordPas ...

  5. 自己写一个chrome扩展程序 - 右键菜单扩展

    最近在学习Spring,心想dotnet如何实现类似形式呢.于是想认真学习Casetle组件,发现没有书籍!而spring的书多得很.于是只好找网上教程了.发现系统的文章不多.Terrylee好多文章 ...

  6. VHDL基础2

    Signals & Variables VHDL 提供了 signal 和 variable 两种对象来处理非静态数据:提供了 constant 和 generic 来处理静态数据. cons ...

  7. centos6.4 安装wireless驱动

    安装完centos6.4之后,目测只有有线的驱动,没有无线驱动. 一.检测网卡 [root@centos ~]# lspci | grep Net :.11b/g LP-PHY (rev ) :) 第 ...

  8. c语言:简单排序:冒泡排序法、选择排序法、插入排序法(待写)

    1.冒泡排序法: 假设有n个数需要按从小到大排序,冒泡排序的原理是,在这一排数字中,将第一个数与第二个数比较大小,如果后面的比前面的小,就将他们交换位置.然后再比较第二个和第三个,再交换,直到第n-1 ...

  9. python 的 字节码 导入使用

    1. python 模块文件可以通过编译为字节码的形式: 名字:model.py x = def funt(): import model print(model.x) x = "zhang ...

  10. 《mysql必知必会》学习_sql文件导入数据库_20180724_欢

    解决问题1:MySQL中导入sql文件. 步骤1:show databases;#看看我有什么数据库 步骤2:use hh;#我要用hh这个数据库,返回database changed说明打开成功. ...