有序表查找(二分查找,插值查找,斐波那契查找)
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;
//二分查找非递归
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;
相关文章推荐
- TCP的连接建立与连接释放
- 二进制编码知识
- 四叠半神话大系(bfs序+st+在线倍增+二分)(北理16校赛)
- 学习move_base包
- string中c_str()、data()、copy(p,n)函数的用法
- poj2456 二分逼近寻找正确答案
- HDU5685
- 关于Python验证码识别安装PIL、tesseract-ocr与pytesseract模块的错误解决
- TCMalloc:线程缓冲的Malloc
- 12354
- 那个夜晚你去了哪里?
- Android文件管理器安装apk流程记录
- Fragment传值-ViewPager优化
- 作业调度问题
- SQL性能优化
- 漫谈数据库索引
- 数据库的原理,一篇文章搞定(三)
- 破解Endnote X7最新版,WIN和MAC下都适用
- 正确使用Qt多线程
- sprint5.0