一、二分法是什么?
二分法查找:也称折半查找(必须在有序数组查找目标元素的特殊算法)。
算法:二分法查找适用于数据量较大时,但是数据需要先排好顺序。
例:在有序的有N个元素的数组中查找用户输进去的数据x。
算法如下:
1.确定查找范围left=0,right=a,lenght-1,计算中项mid=(left+right)/2。
2.若a[mid]=x或left>=right,则结束查找;否则,向下继续。
3.若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给left,并重新计算mid,转去执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给right,并重新计算mid,转去执行步骤2。
二、具体代码
public class ArrySearch {
public static void main(String[] args) {
// 先初始化一个数组
int []arr = {1,3,5,7,9,11,13};
int target = 4;//查找的目标元素
int targetIndex = -1;// 判断输出
//索引左边
int left = 0;
//索引右边
int right = arr.length - 1;
// 不知道循环次数,所以使用while循环,结束条件是left <= right 注意:不是left < right
while (left <= right){
//中间索引的元素
int mid = (left + right) / 2;
if (arr[mid] == target){
targetIndex = mid;
break;
}else if (arr[mid] > target){ //如果中间元素大于查找的元素
right = mid - 1;
}else if (arr[mid] < target){ //如果中间元素小于查找的元素
left = mid + 1;
}
}
if (targetIndex != -1){
System.out.println("查找的目标元素 " + target +" 所在的索引位置是" + targetIndex);
}else{
System.out.println("查找的目标元素 " + target +" 没有找到该元素" );
}
}
总结
注意:是left<=right,而不是left<right.
就是建立在已排序的数组中,不停的对元素进行对半折分,直到找到目标。