前言:
二分查找(也是折半查找),是每次用目標值和一個有序數列的中間值對比。這樣的話每次都可以拋棄一半,隨之範圍也會縮小一半。所以每一次都找中間值對比,範圍也每次都縮小一半。直到對比出結果爲止!
例子:
題目:
使用隨機數產生一個目標值(範圍1-100):在一個有序數列1-100的數組裏找到目標值。
要求:循環次數不能超過10次
實現分解:
1 定義目標值(使用隨機函數生成目標值範圍:1-100)
Random r=new Random();//產生隨機數
//目標值
int randomNum=r.nextInt(100)+1;//產生[1,100]的隨機數
2 定義左邊界索引
int left=0;//開始位置
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;//出結果就結束循環
}
}
整體代碼實現:
客戶端:
Random r=new Random();//產生隨機數
//正確答案
int randomNum=r.nextInt(100)+1;//產生[1,100]的隨機數
System.out.println("目標值爲:"+randomNum);
//獲取對比結果
String relust=RandomGame(randomNum);
System.out.println(relust);//輸出結果
方法:
//最多用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;
}
結果: