public class SortSearch {
int [] example={1,11,23,34,36,38,44,46,49,50,56,57,67,69,71,72,75,78,83,86,89,91,93,97,99,100};
public static void main(String[] args) {
new SortSearch().fibonacci(100);
}
//斐波那契查找
public void fibonacci(int key){
//需要用到这个数列,这个数组长度要>= example长度
int fibo[]={0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597};
int low,high,mid,k=0;
low=0; high=example.length;
//计算k的位置,example.length
while (example.length>fibo[k]){
k++;
}
int [] example2=new int[fibo[k]-1];
for (int i = 0; i < fibo[k]-1; i++) {
if(i < example.length){
example2[i]=example[i];
}else{
example2[i]=example[example.length-1];
}
}
while (low<=high){
mid=low+fibo[k-1]-1;
if(key < example2[mid] ){
high=mid-1;
k=k-1;
}else if(key > example2[mid]){
low=mid+1;
k=k-2;
}else {
System.out.println(key+"在数组位置:"+ (mid > example.length ?example.length-1:mid) );
return;
}
}
System.out.println("没有找到"+key);
}
//插值查找法
public void interpolation(int key){
//数组的下标
int low,high,mid;
low=0;high=example.length-1;
while (low<=high){
//和二分的区别:mid=(low+high)/2 = low+ 1/2 * (high-low),对1/2改进得来
mid=low+((key-example[low])/(example[high]-example[low]))*(high-low);
if(key < example[mid]){
high=mid-1;
}else if(key > example[mid]){
low=mid+1;
}else{
System.out.println(key+"在数组位置:"+mid);
return;
}
}
System.out.println("没有找到"+key);
}
//二分查找
public void binary(int key){
//数组的下标
int low,high,mid;
low=0;high=example.length-1;
while (low<=high){
mid=(low+high)/2;
if(key < example[mid]){
high=mid-1;
}else if(key > example[mid]){
low=mid+1;
}else{
System.out.println(key+"在数组位置:"+mid);
return;
}
}
System.out.println("没有找到"+key);
}
}
算法-有序表查找
最新推荐文章于 2021-08-30 22:02:50 发布