# include <stdio.h>
int main(void)
{
int a[] = {1,5,66,8,55,9,1,32,5,65,4,8,5,15,64,156,1564,15,1,8,9,7,215,
16,45,5,6,164,15,236,2,5,55,6,4,1,59,23,4,5,314,56,15,3,54,
1,54,54,2,4,4,5,15,698,486,56,26,98,78,456,1894,564,26,56,5};
int n; //存放数组a中元素的个数
int m; //查找的数字
int i; //循环变量
n = sizeof(a) / sizeof(int); //求出数组中所有元素的个数
printf("请输入一个数字:");
scanf("%d", &m);
for (i=0; i<n; ++i)
{
if (a[i] == m)
{
printf("下标 = %d\n", i);
break;
}
}
if (i == n)
{
printf("sorry\n");
}
return 0;
}
输出结果是:13 45 78 90 127 189 243 355
现在看看怎么用折半算法在其中查找 243。key = 243
2) 定义变量 low、mid和high 分别存储数组的最小下标、中间下标和最大下标。并有:mid = (low+high)/2 = (0+7)/2 = 3
3) 此时 a[3]=90,而 key>90,说明 243 在 90 的右边,则往后查找:low = mid + 1 = 4
4) 然后重新更新 mid:mid = (4+7)/2 = 5
5) 此时 a[5]=189,而 key>189,说明 243 在 189 的右边,继续往后查找:low = mid+1 = 6
6) 然后重新更新 mid:mid = (6+7)/2 = 6
7) 此时 a[6]=key=243,找到了。high = mid-1 = 2
3) 然后重新更新 mid:mid = (0+2)/2 = 1
4) 此时 a[1]=45,而 key>45,说明 78 在 45 的右边,则往后查找:low = 1+1 = 2
5) 然后重新更新 mid:mid = (2+2)/2 = 2
6) 此时 a[2]=key=78,就找到了。low = mid+1 = 4
3) 然后重新更新 mid:mid = (4+7)/2 = 5
4) 此时 a[5]=189,而 key<189,说明 123 在 189 的左边,则往前查找:high=mid-1=4。
5) 此时 low==high,如果该数仍不是要找的数的话,说明该序列中就没有该数了。
# include <stdio.h>
int main(void)
{
int a[] = {13, 45, 78, 90, 127, 189, 243, 355};
int key; //存放要查找的数
int low = 0;
int high = sizeof(a)/sizeof(a[0]) - 1;
int mid;
int flag = 0; //标志位, 用于判断是否存在要找的数
printf("请输入您想查找的数:");
scanf("%d", &key);
while ((low <= high))
{
mid = (low + high) / 2;
if (key < a[mid])
{
high = mid - 1;
}
else if (a[mid] < key)
{
low = mid +1;
}
else
{
printf("下标 = %d\n", mid);
flag = 1;
break;
}
}
if (0 == flag)
{
printf("sorry, data is not found\n");
}
return 0;
}
输出结果是:n+1/2,而折半查找的平均查找长度为 log2(n+1)-1。可见使用折半查找时,数据数量越多查找效率就越高。
版权说明:Copyright © 广州松河信息科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州松河信息科技有限公司 版权所有