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));
}
初学,见谅