一、折半查找
1、条件:待查表为有序表。
2、原理:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
3、code
int Binary_Search(int *a,int n,int key)
{
int low,high,mid;
low=1; /*定义最低下标为记录首位*/
high=n;
while(low<=hight)
{
mid=(low+high)/2; /*折半*/
if (key<a[mid]) /*若查找值必中值小*/
high=mid-1; /*最高下标调整到比中位小一的下标*/
else if (key>a[mid]) /*若查找值必中值大*/
low=mid+1; /*最低下标调整大必中位大一的下标*/
else
return mid; /*找到值相等的,返回该下标*/
}
return 0; /*若a中没有key则返回0*/
}
二、差值查找
1、条件:待查表为有序表。
2、原理:原理同折半查找,只是将折半的算法mid=(low+high)/2(也就是mid=low+(1/2)*(high-low))改为mid=low+[(key-a[low])/(a[hight]-a[low])]*(high-low)。
3、code
将折半查找的第8行代码改为 mid=low+[(key-a[low])/(a[hight]-a[low])]*(high-low)。
三、斐波那契查找
1、条件:待查表为有序表。
2、原理:利用斐波那契数列的数组进行分割待查的有序表。斐波那契数组F[0]=1,F[1]=1,F[n]=F[n-2]+F[n-1]。
3、code
int Fibonacci_Search(int *a,int n,int key)
{
int low,high,mid,i,k;
low=1; /*定义最低下标为记录的首位置*/
high=n; /*定义最高下标为记录末位置*/
k=0;
while(n>F[k]-1) /*计算n位于斐波那契数列的位置*/
k++;
for(i=n;i<F[k]-1;i++) /*将不满的数值补全*/
a[i]=a[n];
while(low<=high)
{
mid=low+F[k-1]-1; /*计算当前分隔的下标,数组a共F[k]个元素,现在分为F[k-1]个和F[k-2]个元素*/
if(key<a[mid]) /*若查找记录小于当前分隔记录*/
{
high=mid-1; /*最高下标调整到分隔下标mid-1处*/
k=k-1; /*斐波那契数列的下标减一,此时数组a可以缩短为从low到以后的F[k]个了*/
}
else if(key>a[mid])
{
low=mid+1; /*最低下标调整到分隔下标mid+1处*/
k=k-2; /*斐波那契数列的下标减二,此时数组a可以缩短为从mid+1到以后的F[k]个了*/
}
else
{
if(mid<=n)
return mid; /*若相等则说明mid即为查找到的位置*/
else
return n; /*若mid>n说明是补全数值,返回n*/
}
}
return 0;
}
转载于:https://blog.51cto.com/xiaoahei/1224101