-
#include
int main()
int i, j, n, k=0, isfound=0;
int num[15] = ;测试数组。
printf("请输出一个整数:");
scanf("%d", &n);
i = (int)15/2;位移量。
j = (int)15/2;以“指针”的数量为例。
while(k<2)
i = (int)i/2;
if(i == 0) k++;i==0 表示当它对折不再折叠时,仍然有最后的比较,所以 k 用作计数。
如果没有,则计算下一个循环指针的位置。
if(nnum[j])
j = j - i + 1);
elseisfound = 1;
break;如果找到相等的数字,则表示已找到标记并退出循环。
输出结果。 if(isfound)
printf("此数字是数组中 %d 元素的值", j);
elseprintf("没有这样的数字! ");
return 0;
-
VC 运行。
函数 10void f10()。
int i,j,n=15,m=0;
float a[15],k;
printf("这个函数是:将 15 个数字按从小到大的顺序输入到一个数组中。 输入任意数字并使用半折搜索方法(在半折中查找)找到数组中的位置。 如果不是,则输出为“不在数组中”。");
printf("请从小到大输入15位数字:");
for(i=0;i<15;i++)
scanf("%f",&a[i]);
printf("请输入任意数字:");
scanf("%f",&k);
printf("输出为:");
j=n/2;
for(i=1;m==0;i++)
if(ka[n-1])
m=1; printf("该数字不在其数组中");}else if(j<0||j>(n-1))m=1; printf("该数字不在其数组中");}else if(k==a[j])
m=1;printf("此数字是数组中的 %d 元素",j+1);}else if(ka[n/2])
j++;system("pause...");
对不起,我的错了。
-
例如,排序后的数据为 1 5 12 35 64 78 89 123 456
如果要求12,先用12与上半部分9个数字中间的12<64进行比较,这样你要找的数据就在前半部分,即1 5 12 35 64,然后用12和上半部分的中间数字(12)进行比较, 所以你可以在 2 次搜索后找到它。
半折搜索的目的是提高搜索效率!
-
假设有 n 个数字被跟踪升序(这是关键! 返回组)。把它放在一个一维数组之前,如何找到你想要的数字?
顾名思义,二分法将一段数字分成两半。
你想数进去它已经按升序排列了将案例与中位数进行比较时,有 4 种情况:
为什么发现数字x小于中间数后设置left=mid+1和right=mid-1??它不能是 left=mid 和 right=mid?
这涉及到如果有两个中位数(例如,图中第一个循环的中位数是 ),那么系统将自动选择它们左的数字用作中间数字 (21)。
然后,当需要检索时是最后的数字,最后只剩下两个边界,所以不管怎么错过橙子的中间数,左右边界的范围都不会改变,左边的边界仍然是左边的边界。 而你需要检索的数字是右边的边界,即使这个数字确实大于中间的数字,但是由于算法的原因,中间的数字永远不会是正确的边界,所以永远找不到右边边界上的数字。
但是,如果设置为 left=mid+1 和 right=mid-1,则可以使左边框 = 右边框,中间数等于该数字,以便进行比较并找到它。
-
算法思路:二进制搜索的搜索过程是首先确定搜索记录所在的范围(间隔),然后逐渐缩小范围,直到找到记录或找不到记录为止。
步骤如下:比较x和a之间的中间元素a[mid],如果x=a[mid],则x在l中的位置为mid;
如果 x,如果 x>a[mid],则 x 在 a[mid] 之后。
无论您查找哪个部分,该方法都与在 A 中查找 X 相同,但搜索的大小减小了。 这说明,这个问题满足了实行分而治之的第三个条件。