JDK自带的二分查找算法和自己写的普通二分查找算法的比较(java二分查找源代码)

来源:互联网 发布:淘宝商家联盟 编辑:程序博客网 时间:2024/05/22 06:18

一、描述

解析和比较JDK自带的二分查找算法和自己写的普通二分查找算法,使用二进制位无符号右移来代替除2运算,并使用产生随机数的方法产生一定范围的随机数数组,调用Arrays类的sort()静态方法,对int类型数组进行排序。

Math.random()的用法:会产生一个[0,1)之间的随机数(注意能取到0,不能取到1),这个随机数的是double类型,要想返回指定范围的随机数如[m,n]之间的整数的公式:(int)(Math.random()*(m-n+1)+m)

二、源代码

<span style="font-size:18px;">package tong.yue.sort;import java.awt.RenderingHints.Key;import java.util.Arrays;/** * JDK自带的二分查找算法和自己写的普通二分查找算法的比较 * @author Administrator * */public class BinarySearch {public static void main(String[] args) {//调用randomIntegerArray()方法,随机生成25个数字的数组 int[] valueResult = randomIntegerArray(25); //调用Arrays类的sort()静态方法,对以上数组进行排序(二分查找只能针对已经排序的数组才能提高搜索效率) Arrays.sort(valueResult); System.out.print("排序后的结果为:"); printArrayLine(valueResult); //例如我要查找20这个数的位置 int key = 20; //调用普通二分查找算法 int index = binarySearch(valueResult,key);  System.out.println("普通二分查找算法结果:"+key+"在数组中的下标为:"+index);  //调用JDK自带的二分查找算法 index = binarySearchJDK(valueResult,key);  System.out.println("JDK自带的二分查找算法结果:"+key+"在数组中的下标为:"+index);}/* *以下方法负责生成n个随机数的数组,并且随机数的范围为0-49  */public static int[] randomIntegerArray(int n)           //返回由n个随机数组成的整数对象数组    {        int[] value = new int[n];        for (int i=0; i<value.length; i++)            value[i]=new Integer((int)(Math.random()*50));//产生一个0-49的随机数        return value;                                     //返回数组引用    }/** * 普通的二分查找方法,查找到关键字则返回关键字所在的数组下标位置,找不到该关键字就返回-1 */public static int binarySearch(int[] arr,int value) {// 二分查找int min =0;int max = arr.length-1;int mid = (min+max)/2;while(arr[mid]!=value){if(arr[mid]>value){max = mid-1;}else if(arr[mid]<value){min = mid+1;}if(min>max){return -1;}mid = (max+min)/2;}return mid;}/* * JDK自带的的二分查找方法,查找到关键字则返回关键字所在的数组下标位置,找不到该关键字就返回一个与最后查找位置相关的负数 */public static int binarySearchJDK(int[] arr,int value) {// jdk本身自带的二分查找int min =0;int max = arr.length-1;while(min<=max){//采用无符号右移一位,即可以表示除以2int mid = (min+max)>>>1;int midValue = arr[mid];if(midValue>value){max = mid-1;}else if(arr[mid]<value){min = mid+1;}else{return mid;}}//没有找到就返回一个与最终位置有关的负数return -(min+1);}private static void printArrayLine(int[] arr) {// 循环打印数组中的值,没打印10个数就换行for (int i = 0; i < arr.length; i++) {if (i%10==0) {System.out.println();}System.out.print(arr[i] + " ");}System.out.println();}}</span>
三、运行结果

二分查找算法

0 0
原创粉丝点击