所有的查找算法前提是要是有序的排序才行!
1. 插值查找算法
这个方法有四个参数,第一个是数组,第二个是数组的最小下标,第三个是数组的最大下标,第四个是要查找的值!
首先,判断最小下标是否大于最大的下标或者要查找的值是否小于最小下标的值,或者大于数组的最大下标的元素,满足其中一种就返回没找到!
其次就是这个查找的公式“ mid = left +(right-left)*(查找的变量-arr[left])/(arr[right]-arr[left])”
最后就是判断要查找的值是否小于这个mid下标中的元素,如果小于的话,那么返回递归,将这个方法的第三个参数编程当前mid-1就行,其他的没变化,否者
要查找的值是大于当前下标的元素的时候,还是递归,将当前方法中的第二个参数改成mid+1,其他不变化,否者找到的话,直接返回这个mid下标!
**
1. 黄金分割查找算法(斐波那契查找算法)
*顾名思义,发明者就是利用了斐波那契的原理来设计的一种查找算法,效果还可以的,我来讲讲!
首先定义一个斐波那契,返回一个数组,返回的数组就是斐波那契数列的值,大小可以自己定,20大小差不多了,有用!斐波那契数列大家都会做的吧,就是返回这个就行,后面用的到!
其次才是查找算法,这个方法有两个参数,第一个参数是数组,第二个参数是要查找的值。
定义一个low赋初始值为0,表示数组的最小下标
定义一个high赋初始值为数组的最大长度下标
定义一个mid赋初始值为0 表示的就是这个数组的分割
定义一个f[]数组赋初始值为刚刚定义的斐波那契返回的数组
定义一个K赋初始值为0 表示的是返回的斐波那契的下标
用循环来判断数组的最大值的下标大于这个f[k]-1的值,一定循环到最大值的小标小于f[k]-1的时候才算找到,在这个期间,k就递增,直到high小于f[k]-1;
因为f[]数组是斐波那契数列返回的,期间的数组量大,怕原始数组存不下,用了Arrays.copyOf(原始数组,f[k]),重新赋值一个新的数组,新的数组用来指向那个旧的数组,这样就有足够大的空间了,那么如果多出来的空间,会用0补齐,用0不太好,所以,我们将原始数组的最后一个值带换掉这个新数组后面的0,把0改成原始数组的最后面的一个值。
新数组有足够的大小,接下来才是算法公式的重点!
用循环从low小于等于high
mid=low+f[k-1]-1;//表示的就是公式分割到的值
如果要查找的值小于这个mid下标的值的时候,那么high=mid-1;,k–,
否者如果要查找的值大于mid下标的值的时候,那么low=mid+1,k-=2,
(解释:high因为是一开始的最右边,现在将最右边放到最接近查找的值的右边,这样就像是一根棍子切开了两瓣,原来最右边的变成了另一根棍子的最右边,这样就会缩短查找的;low都一样)
还有最后一种情况,就是找到了,找到了之前还要判断high>=mid 返回的就是最小的,否者mid>=high也是返回最小的;
上面循环完了都还没有找到的话,那么都没有了,只能返回没有找到了!;
二分查找算法(递归版)
二分查找算法是一半一半的查找,效率还算可以
二分查找算法的方法有四个参数,第一个参数是数组,第二个参数是最左边的值的小标,第三个参数是最后面的下标,第四个值是要查找的值;
首先判断递归结束的条件,如果最小的下标大于了最大的小标就返回-1;
其次就是得到当前数组的中间值的下标,用最左边的的下标加上最右边的下标除以2,就得到了当前数组的中间下标,
然后就是判断要查找的值是否小于当前这个中间小标的值,如果小于的话,那么就返回递归,将第三个参数变成当前中间下标减1,其他的都不变,
否者当前的中大于中间值的时候,那么就返回递归将第二个值变成当前中间下标加1,其他的不变话,
最后一种情况则是找到了,那么就直接返回当前的下标就行!