C语言 查找

C语言中查找方式有:
有顺序查找,二分法查找,差值查找,斐波那契查找(黄金分割查找)等。
顺序,就不说了。
来看第二个,二分法查找。
每次取中值和所要查找的值比较。然后缩小范围。

int find2(int a[N], int n, int key)  /*二分法查找*/
{
int z=0,y=n-1,m;
do  
{
  m = z+(y - z) / 2;
if (key == a[m])
return m;
else if (key > a[m])
   z = m+1;
else y = m-1;
} while (y - z >=0);
return -1;
}

直接距离说明:数组值为0-1000
查找的数为100,占1000-0的10%
所以在前10%找。

int find3(int a[N], int n, int key)  /* 插值法查找*/
{
int z=0, y=n-1, m;
while (y - z > 0)
{
  m = z+((key-a[z])/(a[y]-a[z])*1.0)*(y-z);
if (key == a[m])
return m;
else if (key > a[m])
   z = m + 1;
else y = m - 1;
}
return -1;
}

在黄金分割查找之前先要点用fab函数。

int fab(int n)
{
int f;
if (n == 1 || n == 2) f = 1;
else f = fab(n - 1) + fab(n - 2);
return f;
} //递归调用

然后查找,比如8个数则分5,3;

int find4(int a[N], int n, int key)
{
int z=0, y, m,i=1;
while(n > fab(i))
  i++;
 n = fab(i);   //不足fab数则补上。
 y = n;
while (y-z>0)
{
  i = 1;
while ((y - z) > fab(i))
   i++;
  m =z+fab(i-1);
if (key == a[m])
return m;
else if (key > a[m])
{
   i = 1;
while ((y-z) > fab(i))
    i++;
   z = m;
}
else 
{
   i = 1;
while ((y - z) > fab(i))
    i++;
   y= m;
}
}
return -1;
}

此法效率最高,在概率上。

这些所有都有一个前提,数列有序。所以,排序函数

void sort(int a[N], int n)
{
int i,k,min=0,t;
for (i = 0; i < n; i++)
{
min = i;
for (k = i+1; k < n ; k++)
if (a[k] < a[min])
min = k;
t = a[i];
a[i] = a[min];
a[min] = t;
}
}

最后上主调函数

#include<stdio.h> 
#define N 5 
int find3(int a[N], int n, int key);
int find2(int a[N], int n, int key);
int find4(int a[N], int n, int key); 
void sort(int a[N], int n); 
void in(int a[N], int n); 
int fab(int n); 
int main() 
{  
int a[N], key,i;  
printf("the key\n");  
scanf_s("%d", &key);  
for (i = 0; i < N; i++) 
 {   
    scanf_s("%d", &a[i]);  
 }  
 sort(a, N);  
 printf("%d", find4(a,N, key));
 }

初学,见谅

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值