c语言折半查找_c语言折半查找法原理

游戏安利 2024-12-21 08:17:14

//参考代码如下:

c语言折半查找_c语言折半查找法原理c语言折半查找_c语言折半查找法原理


c语言折半查找_c语言折半查找法原理


#include

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("请输出一个整数:

");

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

j = j + (i + 1);

else if(n>num[j])

j = j - (i + 1);

else

{isFound = 1;

break; //若找到相等数,标记已找到并退出循环

}}

//输出结果

if(isFound)

printf("该数是数组中第%d个元素的值

", j);

else

printf("查无此数!

");

return 0;

}

// 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(ka[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

j--;

else if(k>a[n/2])

j++;

}("pause...");

}不好意思,我的是错的

#include

int seek(int pArr,int low,int high,int num);

void main()

{int Arr[]={1,2,3,4,5,6,7,8,9,10};

int find,num;

printf("input a num to be found.n");

scanf("%d",&num);

find = seek(Arr,0,9,num);

if (find == -1) printf("num=%d not found!n",num);

else printf("num has been found!nArr[%d] = %dn",find,Arr[find]);

}int seek (int pArr,int low,int high,int num)

{//pArr 为数组名,该数组必须是排好序了(这是二分法的要求),这里按从小到大排序

int mid;

mid = (low+high)/2;

if ((low>=high)&&(pArr[mid]!=num))

return -1;

else

{if (pArr[mid]==num)

return mid;

else if (pArr[mid]>num)

high = mid+1;//中间数字比要查的数还大,说明可能在中间段以前

else

low = mid-1;//同上,可能在中间段以后

return seek(pArr,low,high,num); //递归

}}

刚好,这是我前两天写的。

main(){

int a[15]={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};

int k,top,bot,mid;

scanf("%d",&k);

top=14;bot=0;

while(bot<=top){ /注意这里的等于/

mid=(top+bot)/2;

printf("bot=%d,top=%d,mid=%d,a[%d]=%dn",bot,top,mid,mid,a[mid]);

if(k==a[mid]){

printf("%d",mid);

break;

}else if(k>a[mid]) top=mid-1;

else bot=mid+1;

}if(bot>top) printf("no");

getch();

}

刚好,这是我前两天写的。

main(){

int

a[15]={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};

int

k,top,bot,mid;

scanf("%d",&k);

top=14;bot=0;

while(bot<=top){

/注意这里的等于/

mid=(top+bot)/2;

printf("bot=%d,top=%d,mid=%d,a[%d]=%dn",bot,top,mid,mid,a[mid]);

if(k==a[mid]){

printf("%d",mid);

break;

}else

if(k>a[mid])

top=mid-1;

else

bot=mid+1;

}if(bot>top)

printf("no");

getch();

}

C语言程序编写——折半查找法

#include

#include

int main()

{int a[15]={15,14,13,12,11,10,9,8,7,6,5,4,3,1,0},i,j,put,m,count;

scanf("%d",&put);

i=14;

j=count=0;

m=(i+j)/2;

for(;j<15;j++)

{if(a[j]!=put)

count++;

}j=0;

if(count==15)

printf("无此数n");

else

{while(put!=a[m])

{if(put>a[m])

{while(put!=a[m])

{if(put>a[m])

{m=(m+j)/2;

}else if(put

{m=(m+(i+j)/2)/2;

}}

}if(put

{while(put!=a[m])

{if(put==a[i])

{m=i;

}else if(put>a[m])

{m=(m+(i+j)/2)/2;

}else if(put

{m=(m+i)/2;

}}

}}

printf("该数是数组中第%d个元素n",m+1);

}return 0;

}

前提先把数组排列好

c语言程序编写,一打折办的,查询调法,就比如说这个语言成绩。

折半,故名思意,把拍好的数组不停地分成一半查找

例如你说有15个数

(1)取中间一个数a[6](要是数组是偶数,就取左边一个)和目标数比较

(2)要是比较结果为目标数大(表明要找的数就在a[7]~a[14]里或没有),就在a[7]~a[14]之间取中间数a[10],和目标数比较

(3)不停地比,直到找到目标数,返回下标。

所谓折半查找,是基于你的数组已经是顺序排好的。

就如你说的“15个数由大到小的顺序存放在一个数组中”,我们记为array[15]

次的比较就是让输入的数num与15个数的中间的那个数比,也就是array[7].

如果num小于array[7],

第二次比较就是比较num与array[8]至array[14]的中间数(即array[11]),否则就比较array[0]至array[6]的中间数(即array[3]),依次类推

#include

折半查找法是算法一种,可以被任何计算机语言使用。用C语言自然也可以实现。

1、定义:

在计算机科学中,折半搜索(英语:half-interval

search),也称二分搜索(英语:binary

search)、对数搜索(英语:logarithmic

search),是一种在有序数组中查找某一特定元素的搜索算法。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

2、查找规则:

折半查找法是效率较高的一种查找方法。设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是:

设查找数据的范围下限为l=0,上限为h=4,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。

3、C语言参考代码:

int bin_search(int A[],int n,int key){

//在长度为n的数组A 中折半查找值为key的元素,并返回下标值。如果不存在则返回-1.

int low,high,mid;

low = 0;

high = n-1;//初始low和high为数组的两端。

while(low<=high)

{mid =(low + high)/2;//查找中心点。

if(A[mid]==key)return mid;//已找到,返回下标值。

if(A[mid]

low =mid + 1;

}if(A[mid]>key){//中点位置比key值大,以mid-1为新的上限值。

high= mid - 1;

}}

return -1;//未找到,返回-1.

}

既然按顺序排了就很简单了,以这道题为例。先取出第7个数,比较大小。if 判断 如果大 与(7+1)/2 第4个数比 如果小 与(7+15)/2 第11 个数比相当于判断一次少一半的可能性。依此类推。。。直到找出那个数或是两个相邻的数之间就停止了。

两个错误!

运行成功的代码:

#include

#include

main()

{char

name[10][10],a[10];

int

num[10],i,j,min,t,max,mi,mid,x,flag=0;

for(i=0;i<10;i++)

{printf("输入职工姓名n");

scanf("%s",&name[i]);

printf("输入职工的工号n");

scanf("%d",&num[i]);

}for(i=0;i<=9;i++)

{min=i;

for(j=i;j<10;j++)

if(num[j]

min=j;

t=num[i];

num[i]=num[min];

num[min]=t;

strcpy(a,name[i]);

strcpy(name[i],name[min]);

strcpy(name[min],a);

}for(i=0;i<10;i++)

printf("%s,%dn",name[i],num[i]);

printf("输入你所要查找的那个职工号n");

scanf("%d",&x);//scanf用法取地址符

max=9;

mi=0;

mid=(max+mi)/2;

for(i=0;i<=9;i++)//你这儿i=0没有,那么i在上一个for循环后值为9,压根没查找

{if(num[mid]==x)

{flag=1;break;}

if(num[mid]>x)

max=mid,mid=(max+mi)/2;

if

(num[mid]

mi=mid,mid=(max+mi)/2;

}if(flag)

puts(name[mid]);

else

if(flag==0)

printf("error");

}代码有完善的地方,我只是改了你两个错误。

首先数组必须是按顺序排列

用a[1]...a[10]说吧

先和a[5]做比较,要是比a[5]大的话,那它必定在a[6]...a[10]之间,

然后在和a[8]比,这样下去。。。每次都是取中间的那个比

折半查找

1 。数组必须是按循序排列的

2。顾名思义再就折半查找

好多错误,请分辨好array[index]中index的含义。另外请在百度一下折半查找法的算法,注意index。

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

//参考代码如下:

#include

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

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;

}

C语言中的“折半查找法”是什么?

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。x0dx0a例如排序后的数据是1 5 12 35 64 78 89 123 456x0dx0a你要查找12,首先用12跟上面排好顺序的9个数中间那个比较(64),12<64,因此你查找的数据在前半部分,即1 5 12 35 64,再用12跟前半部分中间那个数比较(12),这样找了2次就找到了x0dx0a折半查找的目的是提高查找的效率!

if (x=a[i]) / 应该是x==a[i]吧 /

用递归实现,程序会很好理解

int f(int a[],int x, int start,int end)

{int i=start+(end-start)/2;

if(start>end) return -1;/ 没找到,返回-1 /

if(a[i]==x) return i;

else if(a[i]>x) return f(a,x,i+1,end);

else return f(a,x,start,i-1);

}--------------------------------------------------------------------------

修改如下:

#include

void main()

{int a[15],x,i,start,end;

printf("input 15 numbers:n");

for(i=0;i<15;i++) scanf("%d",&a[i]);

printf("please enter the number:n");

scanf("%d",&x);

for(start=0,end=14;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;

}}

你的算法有问题的,只有15个数你就模拟下计算机算下就知道。

另外找到x的时候你也没有break退出循环。

首先,应当声明两个变量来记录这般查找空间的范围,这里我们定义begin和end;其次判断语句if(x=a[i])中x=a[i]是赋值语句,"=="是判断相等运算符,应该为if(x == a[i]);,主函数为int型,应返回0表示运行成功,即在程序结尾家return 0;

以下是我在你代码基础上略加修改,已通过运行并成功。

#include

int main()

{int a[15],x,y,i;

printf("input 15 numbers:n");

for(i=0;i<15;i++)

scanf("%d",&a[i]);

printf("please enter the number:n");

scanf("%d",&x);

int begin = 0, end = 14;

while(begin <= end)

{i = (begin + end) / 2;

if (x==a[i])

{y=i+1;

printf("%d",y);

break;

}else

if (x>a[i])

end = i - 1;

else

begin = i + 1;

}return 0;

}

#include

#include

int cmp(const void a,const void b){

return ((int )a)-((int )b);

}void main()

{int a[15],x,i,start,end;

printf("input 15 numbers:n");

for(i=0;i<15;i++)

scanf("%d",&a[i]);

qsort(a,15,sizeof(int),cmp);

printf("please enter the number:n");

scanf("%d",&x);

for(start=0,end=14;start<=end;)

{i=(start+end)>>1;

if (x==a[i])

{printf("%d",i+1);

getchar();

getchar();

return;

}else if (x>a[i])

start = i+1;

else

end=i-1;

}}

版权声明:本文内容由互联。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发 836084111@qq.com 邮箱删除。