c语言编程实现“折半查找”的过程。

编程实现“折半查找”的过程。
折半查找的处理过程:在一个数据已排好序的数组中,首先比较要查找的值与数组中间的元素,如果两者相等,则查找结束;如果前者比后者小,则要查找的数据必然在数组的前半部,此后只需在数组的前颁布中继续折半查找;如果前者的数值比后者大,则要查找的数据必然在数组的后半部,此后只需在数组的后半部继续进行折半查找
要求:
1) 设定一个整形数组存放20个元素,采用直接赋值地方法在程序中初始化该数组(假设这些数据已排列)
2) 用scanf函数输入一个要找的数值
3) 对查找的结果给出相应的说明,如果找到该数值,则输出“Found”信息,并给出该书是数组中的第几个元素。如果该数值不在数组中,则输出“Not found”信息
4) 修改程序,设定输入的数据是无序的,则先要对这些无序数据进行排序,然后再采用“折半查找”
5) 修改程序,编写一个选择排序函数,对无序数据进行排序;编写一个查找函数对已排好序的数据进行查找。在主函数中数据(无序),调用上述函数,输出结果
运行有问题呀,能不能修改一下

折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。 折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素必须有序。参考程序,希望对你有所帮助!
#include<stdio.h>
void main()
{
int a[20],x,i,start,end;
printf("input 20 numbers:\n");
for(i=0;i<20;i++) scanf("%d",&a[i]);
printf("please enter the number:\n");
scanf("%d",&x);
for(start=0,end=19;start<=end;)
{
i=start+(end-start)/2;
if (x==a[i])
{
printf("%d",i+1);
getch();
return;
}
else if (x>a[i]) end = i-1;
else start=i+1;
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-08
//参考代码如下:
#include <stdio.h>
int main()
{
int i, j, n, k=0, isFound=0;
int num[15] = {88,86,75,74,61,56,52,43,39,34,31,22,18,16,8};   //测试数组

printf("请输出一个整数:\n");
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(n<num[j])
j = j + (i + 1);
else if(n>num[j])
j = j - (i + 1);
else
{
isFound = 1;
break;          //若找到相等数,标记已找到并退出循环
}
}
//输出结果
if(isFound)
printf("该数是数组中第%d个元素的值\n", j);
else
printf("查无此数!\n");
return 0;
}

第2个回答  2010-12-17
// VC运行
//函数10
void f10()
{
int i,j,n=15,m=0;
float a[15],k;
printf("此函数为: 将15数从小到大的顺序输入到一个数组中。\n输入任意一个数,用折半查找法(折半之后再查找)找到在该数组中的位置。\n若不在输出“不在数组中”\n");
printf("请按从小到大依次输入15个数:\n");
for(i=0;i<15;i++)
scanf("%f",&a[i]);
printf("请输入任意一个数:");
scanf("%f",&k);
printf("输出为:\n");
j=n/2;
for(i=1;m==0;i++)
{
if(k<a[0]||k>a[n-1])
{m=1; printf("该数不在其数组中\n");}
else if(j<0||j>(n-1))
{m=1; printf("该数不在其数组中\n");}
else if(k==a[j])
{m=1;printf("该数为在数组中的第%d元素\n",j+1);}

else if(k<a[n/2])
j--;
else if(k>a[n/2])
j++;
}
system("pause...");
}
不好意思,我的是错的本回答被提问者采纳
相似回答