前言:
二分查詢(也是折半查詢),是每次用目標值和一個有序數列的中間值對比。這樣的話每次都可以拋棄一半,隨之範圍也會縮小一半。所以每一次都找中間值對比,範圍也每次都縮小一半。直到對比出結果為止!
例子:
題目:
使用隨機數產生一個目標值(範圍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);//輸出結果
實現結果
實現分解:
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 協議》,轉載必須註明作者和本文連結