Java 實現二分查詢(在 1-100 裡找到目標值)

ksh123發表於2020-07-09

前言:

二分查詢(也是折半查詢),是每次用目標值和一個有序數列的中間值對比。這樣的話每次都可以拋棄一半,隨之範圍也會縮小一半。所以每一次都找中間值對比,範圍也每次都縮小一半。直到對比出結果為止!

例子:

題目:

使用隨機數產生一個目標值(範圍1-100):在一個有序數列1-100的陣列裡找到目標值。
要求:迴圈次數不能超過10次

整體程式碼實現:

封裝的方法

  //最多用10次猜測出,(1-100範圍內)產生的隨機數。
    public static String RandomGame(int randonNum){
        int[] array=new int[100];
        String str="";
        for (int i = 1; i <= 100; i++) {
            array[i-1]=i;
        }//迴圈向陣列裡存入100個數字
        int left=0;//開始位置
        int right=array.length-1;//結束位置
        for (int j = 0; j < 10; j++) {
            int mid=(left+right)/2;//中間位置索引
            //每次用目標值和中間值做對比
            //目標值大於中間值
            if (randonNum>array[mid]){
                //改變其實位置,起始位置等於mid+1,
                也就是從中間位置往右諾一位
                left=mid+1;
            }
            //目標值小於中間語句
            if(randonNum<array[mid]){
                right=mid-1;
            }
            //目標值等於中間語句
            if(randonNum==array[mid]){
                str="恭喜猜中了,目標值為"+array[mid]+
                "迴圈次數為"+j+"次";
                break;//出結果就結束迴圈
            }
        }
        return str;
    }

客戶端:

        Random r=new Random();//產生隨機數
        //正確答案
        int randomNum=r.nextInt(100)+1;//產生[1,100]的隨機數
        System.out.println("目標值為:"+randomNum);
        //獲取對比結果
        String  relust=RandomGame(randomNum);
        System.out.println(relust);//輸出結果

實現結果

Java實現二分查詢(在1-100裡找到目標值)

實現分解:

1 定義目標值(使用隨機函式生成目標值範圍:1-100)

        Random r=new Random();//產生隨機數
        //目標值
        int randomNum=r.nextInt(100)+1;//產生[1,100]的隨機數

2 定義左邊界索引

 int right=array.length-1;//結束位置

3 定義佑邊界索引

 int right=array.length-1;//結束位置

4定義中間索引和迴圈對比(在迴圈裡定義中間值索引或者迴圈外面,都行)
核心程式碼:(結合實現分解的2,3步驟)

for (int j = 0; j < 10; j++) {
            int mid=(left+right)/2;//中間位置索引
            //每次用目標值和中間值做對比
            //目標值大於中間值
            if (randonNum>array[mid]){
                //改變其實位置,起始位置等於mid+1,
                也就是從中間位置往右諾一位
                left=mid+1;
            }
            //目標值小於中間語句
            if(randonNum<array[mid]){
                right=mid-1;
            }
            //目標值等於中間語句
            if(randonNum==array[mid]){
                str="恭喜猜中了,目標值為"+array[mid]
                +"迴圈次數為"+j+"次";
                break;//出結果就結束迴圈
            }
        }
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章