二分探索を使用する前提は、検索される配列がソートされていることです。
最初に乱数を使用して配列を生成し、次に配列を並べ替えます。
Random rand = new Random();
int[] arr = new int[30];
//给数组内的元素随机赋值
for (int i = 0; i < arr.length; i++) {
arr[i] = rand.nextInt(100);
}
//用Arrays类排序
Arrays.sort(arr);
//遍历数组
for (int i : arr) {
System.out.print(i+"\t");
}
//换行
System.out.println();
アイデア:開始ビット(配列の最初の要素)と終了ビット(配列の最後の要素)を定義し、中間位置mid =(start + end)/ 2で、検索する要素を次の要素と比較します。中央の位置、検索する要素が中央の位置に対応する値よりも小さい場合、end = mid -1、検索する要素が中央の位置に対応する値よりも大きい場合、start = mid + 1、対応する値が見つかった場合はループから抜け出し、そうでない場合はstart> endまでループ内を検索し続けます。これにより、対応する値が見つからないことが証明され、ループが停止します。
コードは次のように表示されます。
//随机生成一个数,在数组中用二分法查找它
int v = rand.nextInt(100);
//count统计查找次数
//index为假设下标
int begin=0,end=arr.length-1,mid,count=0,index=-1;
while (begin<=end){
mid = begin + (end-begin)/2; //或者mid = (begin+end)/2;
if (v>arr[mid]){
begin = mid+1;
count++;
}else if(v<arr[mid]){
end = mid-1;
count++;
}else {
//存放该值在数组中的下标
index = mid;
count++;
break;
}
}
完全なコードは次のとおりです。
import java.util.Arrays;
import java.util.Random;
public class BinarySearch {
public static void main(String[] args) {
Random rand = new Random();
int[] arr = new int[30];
for (int i = 0; i < arr.length; i++) {
arr[i] = rand.nextInt(100);
}
Arrays.sort(arr);
for (int i : arr) {
System.out.print(i+"\t");
}
System.out.println();
int v = rand.nextInt(100);
int begin=0,end=arr.length-1,mid,count=0,index=-1;
while (begin<=end){
mid = begin + (end-begin)/2;
if (v>arr[mid]){
begin = mid+1;
count++;
}else if(v<arr[mid]){
end = mid-1;
count++;
}else {
index = mid;
count++;
break;
}
}
System.out.println("一共查找了"+count+"次");
System.out.println(v+(index!=-1 ? "存在于数组中下标为"+index:"不存在于数组中"));
}
}
コンソール出力は次のとおりです。