首先介绍一下什么是二分法查找。
顾名思义二分法即多次将待查数组的长度折半,但前提条件时待查找数组中的数据需要是已经排序好了的数据。
主要思想:
对于待查找数组arr[low,high],其中high=arr.length-1,待查找元素des
(1)确定数组中间位置mid=(low+high)/2
(2)将查找值des与arr[mid]进行比较,若相等,则直接返回该位置;否则确定新的查找位置,继续二分查找。区域确定如下:如果arr[mid]>des由数组的有序性可知
arr[mid,mid+1.........,high]>des;故新的区间为arr[low,.........,mid-1];如果arr[mid]<des,同理由数组的有序性可知arr[low,.........mid-1]<des,则新的区间为arr[mid+1,......,high]。每一次查找都与中间值比较,就可以确定是否查找成功,不成功当前查找区间缩小一半
具体代码如下:
package Algorithm; public class binarySearch { public static void main(String[] args) { int[] src=new int[]{1,3,5,7,9}; System.out.println(binarySearch1(src,7)); System.out.println(binarySearch1(src,3,0,src.length-1)); } /** * *二分查找算法* * @param srcArray * 有序数组 * @param des * 查找元素 * @return des的数组下标,没找到返回-1 */ public static int binarySearch1(int[] srcArray,int des) { int low=0; int high=srcArray.length-1; while (low<=high) { int mid=(low+high)/2; if (des==srcArray[mid]) { return mid; } else if(des<srcArray[mid]) { high=mid-1; } else { low=mid+1; } } return -1; } /** * 二分查找(递归)被查找数在数组中的位置 * @param dataset * @param data * @param beginIndex * @param endIndex * @return index 被查找数下标位置 */ public static int binarySearch1(int[]dataset,int data,int beginIndex,int endIndex) { int mid=(beginIndex+endIndex)/2; if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex) { return -1; } if (data<dataset[mid]) { return binarySearch1(dataset,data,beginIndex,mid-1); } else if(data>dataset[mid]) { return binarySearch1(dataset,data,mid+1,endIndex); } else { return mid; } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zzc8265020/article/details/47805311