- 二分法查找的前提是:序列有序;所以在再调用binarySearch方法之前,我们先要对元素进行排序;
- 常用形式:
public static void main(String[] args) {
List<String> li = new ArrayList<String>();
li.add("abcd");
li.add("llbc");
li.add("dddddd");
li.add("dddddd");
li.add("kl"
sop("未排序前 "+li);
Collections.sort(li);
sop("自然排序后 "+li);
//正常查找:
int index = Collections.binarySearch(li,"llbc");
sop("llbc 角标: "+index);
//非正常查找:
int index1 = Collections.binarySearch(li,"bb");
sop("bb 角标: "+index1);
}
public static void sop(Object obj) {
System.out.println(obj);
}
-
结果:
image.png
- 下面我们再来回顾一下二分法查找:
**//自定义一个二分法查找器,回顾一下二分法的原理;**
//返回索引,即角标。
public static int halfSearch(List<String> li, String key) {
int min, mid, max;
min = 0;
max = li.size();
while(min<+max) {
mid = (min+max) >> 1;// /2
String str = li.get(mid);
int num = str.compareTo(key);
if(num>0)
max = mid-1;
else if(num<0)
min = mid+1;
else
return mid;
}
//当遍历完整个集合序列还未找到指定元素,就返回-1;
return -1;
}
**sop("未排序前 "+li);**
Collections.sort(li);
sop("自然排序后 "+li);
//正常查找:
int index = halfSearch(li,"kwwwwl");
sop("kwwwwl 角标: "+index);
//非正常查找:
int index1 = halfSearch(li,"bb");
sop("bb 角标: "+index1);
-
结果:
网友评论