使用二分法查找数组中的数据:
分析:二分法查找适用于数据量较大时,但是数据需要先排好顺序。
主要思想是:(设查找的数组区间为array[low, high])
(1)确定该区间的中间位置K(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。
时间复杂度
1.最坏情况查找最后一个元素(或者第一个元素)Master定理T(n)=T(n/2)+O(1)所以T(n)=O(log2n)
2.最好情况查找中间元素O(1)查找的元素即为中间元素(奇数长度数列的正中间,偶数长度数列的中间靠左的元素)
public static void main(String[] args) {
//定义一个数组
int []arr={2,8,74,687,9,4,7,687,456,3214674,68,4852};
//二分法查找必须是有序数组,否则无法完成二分法查找
//先给数组进行排序
Arrays.sort(arr);
//遍历数组,为了试验结果
System.out.println(Arrays.toString(arr));
//调用方法,查询需要值
ArrayDichotomy(arr,4852);
}
//使用二分法查找数组中的数据,并返回数据在数组中的位置(数组下标)
public static void ArrayDichotomy(int arr[],int number){
//定义查询范围的最小值,第一个查询数应该是从零开始
int min=0;
//定义查询范围的最大值,第一次查询应该是数组的长度
int max=arr.length-1;
//定义查询数据所在的位置,用来二分计数,二分计算应该是最大值加上最小值的和除以2
int mid=(max+min)/2;
//开始循环查找,没有查找的需要的值,就一直循环直到查找到数据为止
while (arr[mid]!=number){
//二分判断,如果需要查找的数字,大于数组中间数,则结果值应该在数组的后半段,反而反之
if (number>arr[mid]) {
//如果在后半段,则移动最小值到当前的中间数的后一位
min=mid+1;
}
//如果查询数小于中间数,则在前半段
if (number<arr[mid]) {
//在前半段,则移动最大数到中间值的前一位
max=mid-1;
}
//当中间值超越了数组下标范围时,则查无此数
if (mid <=0 || mid>=arr.length) {
//查不到数,则结束循环
System.out.println("查无此数!");
//退出程序
return;
}
//重新计算中间数,进入下一次循环
mid=(mid+max)/2;
}
//如果查询的数据结束后,还在数组范围内,输出需要查找数据的下标
if (mid >=0 && mid <=arr.length) {
System.out.println("你查询的数"+number+"是数组中的第"+(mid+1)+"个数");
return;
}
//超出数组,查无此数
System.out.println("查无此数!");;
}
运行结果,能查询的样子:
查无此数时: