Java实现二分法排序
二分法:(二分法不是只能做数组,这里的数组只是为了举例)
在给出的有序排列的数组中,把目标值和数组中间值进行比较,如果相等,则返回中间值下标,如果目标值小于中间值,就从数组的前半段再次执行二分法查找,如果目标值大于中间值,从数组的后半段开始二分法查找
二分法查找主要是比较的次数少,查找的速度快,平均性能好,但是待查表一定要是有序的,插入删除比较困难,所以二分法查找不适用于经常变动的有序列表.
上代码:
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实现二分法排序的更多相关文章
- java简单的二分法排序
二分法排序的思路:数据元素要按顺序排列,对于给定值 x,从序列的中间位置开始比较,如果当前位置值等于 x,则查找成功:若 x 小于当前位置值,则在数列的前半段中查找:若 x 大于当前位置值则在数列的后 ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- [No000087]Linq排序,SortedList排序,二分法排序性能比较
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; ...
- [PHP]基本排序(冒泡排序、快速排序、选择排序、插入排序、二分法排序)
冒泡排序: function bubbleSort($array){ $len=count($array); //该层循环控制 需要冒泡的轮数 for($i=1;$i<$len;$i++){ / ...
- Java中的排序算法(2)
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...
- Java实现常见排序算法
常见的排序算法有冒泡排序.选择排序.插入排序.堆排序.归并排序.快速排序.希尔排序.基数排序.计数排序,下面通过Java实现这些排序 1.冒泡排序 package com.buaa; import j ...
- js 排序:sort()方法、冒泡排序、二分法排序。
js中的排序,这里介绍三种,sort()方法.冒泡排序.二分法排序. 1.sort方法 写法: 数组.sort(); 返回排好序的数组,如果数组里是数字,则由小到大,如果是字符串,就按照第一个字符的 ...
- Comparable与Comparator,java中的排序与比较
1:比较和排序的概念 比较:两个实体类之间按>,=,<进行比较. 排序:在集合类中,对集合类中的实体进行排序.排序基于的算法基于实体类提供的比较函数. 基本型别都提供了默认的比较算法,如s ...
- Java之List排序出错
Java之List排序出错 Bound mismatch: The generic method sort(List<T>) of type Collections is not appl ...
随机推荐
- centos7 新增ip
1.进入network-scripts目录:cd /etc/sysconfig/network-scripts/ 2.复制ifcfg-eth0: cp ifcfg-eth0 ifcfg-eth0:0 ...
- math.net 拟合
参考:http://blog.csdn.net/ztmsimon/article/details/50524392 在论坛中总看到有人在说Math.NET Iridium,查了一下,现在被整合到Mat ...
- poj 1094 Sorting It All Out 拓补排序
Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...
- FoonSunCMS-Word图片上传功能-Xproer.WordPaster
1.1. 与FoosunCMS 3.1.0930整合 基于WordPaster-asp-CKEditor4.x示例 下载地址:http://www.ncmem.com/download/WordPas ...
- 自己写一个chrome扩展程序 - 右键菜单扩展
最近在学习Spring,心想dotnet如何实现类似形式呢.于是想认真学习Casetle组件,发现没有书籍!而spring的书多得很.于是只好找网上教程了.发现系统的文章不多.Terrylee好多文章 ...
- VHDL基础2
Signals & Variables VHDL 提供了 signal 和 variable 两种对象来处理非静态数据:提供了 constant 和 generic 来处理静态数据. cons ...
- centos6.4 安装wireless驱动
安装完centos6.4之后,目测只有有线的驱动,没有无线驱动. 一.检测网卡 [root@centos ~]# lspci | grep Net :.11b/g LP-PHY (rev ) :) 第 ...
- c语言:简单排序:冒泡排序法、选择排序法、插入排序法(待写)
1.冒泡排序法: 假设有n个数需要按从小到大排序,冒泡排序的原理是,在这一排数字中,将第一个数与第二个数比较大小,如果后面的比前面的小,就将他们交换位置.然后再比较第二个和第三个,再交换,直到第n-1 ...
- python 的 字节码 导入使用
1. python 模块文件可以通过编译为字节码的形式: 名字:model.py x = def funt(): import model print(model.x) x = "zhang ...
- 《mysql必知必会》学习_sql文件导入数据库_20180724_欢
解决问题1:MySQL中导入sql文件. 步骤1:show databases;#看看我有什么数据库 步骤2:use hh;#我要用hh这个数据库,返回database changed说明打开成功. ...