標籤:jdk內建二分尋找演算法 java原始碼 隨機數產生函數 arrays.sort 隨機數產生範圍
一、描述
解析和比較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>
三、運行結果
JDK內建的二分尋找演算法和自己寫的普通二分尋找演算法的比較(java二分尋找原始碼)