查找算法,分顺序查找和有序表查找,前者是一种最基本的,也是最费力的方式,就是挨个去匹配要查找的元素,而后者则是先排序,然后去查找!在处理较大数据的时候,有序表的查找算法是很有优势的!
#include
int Binary_Search(int *a, int n, int key)
{
int low, mid, high; //定义高中低3个变量
low = 0;
high = n;
while(low <= high)
{
mid = (low + high) / 2; //取中间的那个,就是二分
if (key < a[mid]) //如果小于中间值,high=mid-1
high = mid -1;
else if (key > a[mid]) //相反就加一
low = mid + 1;
else
return mid;
}
return 0;
}
int main()
{
int a[10] = {1, 4, 8, 11, 24, 345, 567, 789, 999, 1234};
int reValue = Binary_Search(a, 10, 24);
printf("%d", reValue);
return 0;
}
同样是有序排序法,下面介绍的是插值排序法,其原理和二分法是一样的,只是不是二分而已,就上面mid = low + (key - a[low])/(a[high] - a[low])*(high - low)换成这个,其他的一样,二斐波那契查找,是先构建斐波那契数列,
#include
int Fibonacci_Search(int *a, int n, int key)
{
int F[10] = {0,1,1,2,3,5,8,13,21,34}; //构造一个斐波那契如
int low, high, mid, i, k; //果复杂可以使用函数
low = 0;
high = n;
k = 0;
while (n > F[k] -1) /*计算n位于fibonacci数列的位置*/
++k; //匹配n对应的F(K)
for (i = n; i < F[k]; ++i) /*将数列补满*/
a[i] = a[n]; //现在这个数列有f[k]个数值
while(low <= high)
{
mid = low + F[k - 1] - 1; //此时,这个数列有F(k)个数,数列的个数
if(key < a[mid]) //如果采用飞的分法,前面有F(k-1)个数
{ //那么下标mid = low + F(k-1) -1
high = mid -1;
k = k -1;
}
else if(key >a[mid]) //后面剩的数的个数就是F(k-2)个
{
low = mid + 1;
k = k - 2;
}
else
{
if (mid <= n)
return mid;
else
return n;
}
}
return 0;
}
int main()
{
int a[10] = {1, 4, 8, 11, 24, 345, 567, 789, 999, 1234};
int reValue = Fibonacci_Search(a, 10, 24);
printf("%d", reValue);
return 0;
}
这种算法,在求下标的时候,只有加减发的运算,适合与较大数据的处理!