您的位置:首页 > 其它

有序表查找(二分查找,插值查找,斐波那契查找)

2016-05-17 20:18 399 查看
1.二分查找

//二分查找非递归
int Binary_Search1(int *num, int len,int target){
int low=0,hight=len-1,mid;
while(low<=hight){
mid=(low+hight)/2;
if(num[mid]==target)
return mid;
else if(num[mid]>target)
hight=mid-1;
else
low=mid+1;
}
return -1;
}

//二分查找递归
int Binary_Search2(int *num, int low, int hight, int target){
while(low<=hight){
int mid=(low+hight)/2;
if(num[mid]==target)
return mid;
else if(num[mid]>target)
return Binary_Search2(num,low,mid-1,target);
else
return Binary_Search2(num,mid+1,hight,target);
}
return -1;
}
2.插值查找
//插值查找
int InterpolationSearch(int *num,int len,int key){
int low=0,high=len-1,mid;
while(low<=high){
mid=low+(high-low)*(key-num[low])/(num[high]-num[low]);
if(num[mid]==key)
return mid;
else if(num[mid]>key)
return Binary_Search2(num,low,mid-1,key);
else
return Binary_Search2(num,mid+1,high,key);
}
return -1;
}


3.斐波那契查找
//斐波那契查找
int FibonaciSearch(int *num, int len, int key){
int low=0,high=len-1,mid,i,k=0;
while(len>Fibonaci(k)-1)
k++;
for(i=len;i<(Fibonaci(k)-1);i++)//将不满的数组补全
num[i]=num[len-1];
while(low<=high){
mid=low+Fibonaci(k-1)-1;
if(num[mid]>key){
high=mid-1;
k--;
}
else if(key>num[mid]){
low=mid+1;
k-=2;
}
else{
if(mid<len)
return mid;
else
return len-1;
}
}
return -1;
}


二分查找是进行加法与除法运算

mid=(low+hight)/2;插值查找进行复杂的四则运算
mid=low+(high-low)*(key-num[low])/(num[high]-num[low]);

斐波那契
mid=low+Fibonaci(k-1)-1;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: