查找
线性查找
这个查找算法就不用讲述了,小编相信很多小伙伴都懂,线性查找适用于无序的数查找,但这种算法有些暴力,需要遍历数组每个下标的元素.
二分查找
分析
这是非常经典的查找算法,其规定数组的元素一定是有序的,因为我们要根据元素的大小进行一个折半,从而达到缩小遍历范围的目的.
比如上图,如果小编要找67,就可以先找到中间位置第三位,为5(从0开始),然后判断67是否比5大,如果比5大说明一定在5右边,然后又开始在5右边折半,找到89,发现该数字比67大,然后在89左边折半(此时注意是以67为起点),便找到了67.
代码实现
public class FoldSearch {
public static int foldSearch(int value,int[] a){
int left=0,right=a.length-1;
if (value<a[0] || value>a[right])
return -1;
int middle;
while (true){
middle=(left+right)/2;
if (a[middle]<value){
left=middle+1;
}else if (a[middle]>value)
right=middle-1;
if (a[middle]==value)
return middle;
if (left==right)
return -1;
}
}
public static void main(String[] args) {
int[] a=new int[]{1,3,5,7,8,9,10,15};
System.out.println(FoldSearch.foldSearch(11, a));
}
}
优化: 二分查找主要的思想在于计算middle,然后不断改变middle以减少遍历达到高效率.但你会发现,如果你寻找的某个值刚好在某个极限值,其实二分查找就没有意义,因为有可能只通过遍历一个元素就可以找到,效率反而比二分查找要高.
所以这里我们可以优化一下,因为middle的分母是写的,所以我们每次都是以中间作为middle,对于有些在边缘的查找值确实是鸡肋,那就用一个概率算法,大概计算出查找值在哪里就可以了.
直接将middle的分母变为(value-a[left])/(a[right]-a[left]) ,该式子就是在近似计算value的值在哪个位置.