试题
对一个含有20个元素的有序数组做二分查找,数组起始下标为1,则查找A[2]的比较序列的下标为()
A. 9,5,4,2
B. 10, 5, 3, 2
C. 9, 6, 2
D. 20, 10, 5, 3, 2
解析
没错,可能懂的人一眼就瞧出来了,选B;不懂的百度也能搜出来。当然网上也有不同的声音,有些童鞋感觉答案不对,在求指教!计算得出的是{10,5,2}。
吓得我赶紧百度了一下百度百科(尽管有时候也挺扯淡的),百度百科给出的demo是:
假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.
1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为mid>x,故应在前半段中查找。
2.令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>mid,故确定应在后半段中查找。
3.令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a[mid]=x,查找成功。
如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a[mid],按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功。
package com.itstyle.algorithm;
import java.util.ArrayList;
import java.util.List;
/**
* 二分查找 有则返回下标,无则返回-1
*/
public class Dichotomy {
public static void main(String[] args) {
int[] A = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };
binary(A,3);
}
public static int binary(int[] arr, int key) {
List<String> numList = new ArrayList<String>();
int start = 0;
int end = arr.length - 1;
while (start <= end) {
int middle = (end - start) / 2+1;
//int middle = (start + end);//2+1;若使用(start + end)/2求中间位置容易溢出
numList.add(middle+"");
if (key < arr[middle]) {
end = middle - 1;
} else if (key > arr[middle]) {
start = middle + 1;
} else {
System.out.println("A[2]下标为:"+numList);
return middle;
}
}
return -1;
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。