您的位置:首页 > 编程语言 > Java开发

java的二分法查找

2017-10-14 23:30 274 查看
java的二分法查找

          二分法查找属于查找算法,主要适用于针对有序数组的查找。

二分法:(二分法不是只能做数组,这里的数组只是为了完成demo)

 在给出的有序排列的数组中,把目标值和数组中间值进行比较,如果相等,则返回中间值下标,如果目标值小于中间值,就重数

 组的前半段再次执行二分法查找,如果目标值大于中间值,从数组的后半段开始二分法查找

 二分法查找主要是比较的次数少,查找的速度快,平均性能好,但是待查表一定要是有序的,

 插入删除比较困难,所以二分法查找不适用于经常变动的有序列表。

java二分法的实现方法:

       实现方法主要有两种:

   1、循环二分查找

   2、递归二分查找

实现代码:

package com.leo.kang.interview;

public class BinarySearch {

// 查找次数
static int count;

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

System.out.println(searchRecursive(array, 0, array.length - 1, 9));
System.out.println(count);
count = 0;
System.out.println(searchLoop(array, 9));
System.out.println(count);
}

/**
* 执行递归二分查找,返回第一次出现该值的位置
*
* @param array
* 已排序的数组
* @param start
* 开始位置
* @param end
* 结束位置
* @param findValue
* 需要找的值
* @return 值在数组中的位置,从0开始。找不到返回-1
*/
public static int searchRecursive(int[] array, int start, int end,
int findValue) {
// 如果数组为空,直接返回-1,即查找失败
if (array == null) {
return -1;
}
count++;
if (start <= end) {
// 中间位置
int middle = (start + end) / 1;
// 中值
int middleValue = array[middle];

if (findValue == middleValue) {
// 等于中值直接返回
return middle;
} else if (findValue < middleValue) {
// 小于中值时在中值前面找
return searchRecursive(array, start, middle - 1, findValue);
} else {
// 大于中值在中值后面找
return searchRecursive(array, middle + 1, end, findValue);
}
} else {
// 返回-1,即查找失败
return -1;
}
}

/**
* 循环二分查找,返回第一次出现该值的位置
*
* @param array
* 已排序的数组
* @param findValue
* 需要找的值
* @return 值在数组中的位置,从0开始。找不到返回-1
*/
public static int searchLoop(int[] array, int findValue) {
// 如果数组为空,直接返回-1,即查找失败
if (array == null) {
return -1;
}

// 起始位置
int start = 0;

// 结束位置
int end = array.length - 1;

while (start <= end) {
count++;
// 中间位置
int middle = (start + end) / 2;
// 中值
int middleValue = array[middle];

if (findValue == middleValue) {
// 等于中值直接返回
return middle;
} else if (findValue < middleValue) {
// 小于中值时在中值前面找
end = middle - 1;
} else {
// 大于中值在中值后面找
start = middle + 1;
}
}
// 返回-1,即查找失败
return -1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: