当前位置:首页 » 编程语言 » 二分查找c语言

二分查找c语言

发布时间: 2023-02-21 03:18:16

A. c语言 二分法查找次数公式怎么推导

对具有n个元素的有序数组进行二分法查找,要分析的比较次数,可以使用画二叉判定树的方法来分析。该二叉判定树的高度为[log2(n)]+1层,此即为二分查找的最多比较次数,比如:n=1000,则最多比较[log2(1000)]+1=9+1=10次。

如果要计算平均的比较次数,则需要对二叉判定树中的每个节点进行分析,处于第一层的比较1次,第二层的比较2次,第三层比较3次,依次类推……把各个节点的比较次数累加,再处于节点数(元素个数)即为平均比较次数,这里假设查找是在等概率的情况下进行的。

举个例子:有9个元素的有序数组,对每个元素按1,2,3...8,9进行编号,则其二叉判定树如下:



这样分析,能看懂吗?希望能帮到你!

B. c语言中如何将顺序表排序并实现二分法查找

voidInsertSort(sqR)

这个函数是按值传递参数的。换句话说,你的顺序表在传递的时候被复制了一遍,然后这个函数收到的是一个副本,然后这个程序也许成功排序了这个副本,但是你原来的顺序表并没有改变。你可以考虑传递这个顺序表的指针。比如这样

voidInsertSort(sq*pR)
{
sqR=*pR;
//以下不变
...
}

调用的时候传递R的地址

InsertSort(&R);

C. C语言二分法查找

二分法查找又称折半查字法;
思路是.恩!
举例吧0,1,2,3,4,5,6,7,8中找5取数组中的一半也就是地五个4与5比较,如果4>5(就是中间的那个数比要找的那个大,那么就取那个数之前的那部分);如果4<5(就是中间的那个数比要找的那个小,就取那个数只后的那部分);如此循环下去;
不好意思,语文没学好,表达不清楚

D. C语言二分查找

if(key==a[mid]) return mid; 这句就是罪魁祸首。呵呵你是想用return来结束while循环吧。用错了。
找到结果后,你应该是把结果输出出来,而不是用return。return语句是返回整个函数的,在你的程序里main函数就结束了,你当然看不到任何结果了。
改为:
if(key==a[mid]) break; *这行是结束while循环的。而不是你所用的return*/
}

E. C语言二分查找法

#include <stdio.h>

int binfind(int val[] , int num , int value)
{
int start = 0;
int end = num - 1;
int mid = (start + end)/2;
while(val[mid] != value && start < end)
{
if (val[mid] > value)
{
end = mid - 1;
}
else if (val[mid] < value)
{
start = mid + 1;
}
mid = ( start + end )/2;
}
if (val[mid] == value)
return mid;
else
return -1;
}

int main()
{
int nums[] = {1 , 3 , 4 ,7 ,8 , 12 ,45 ,67 ,97 ,123 ,456 ,675 ,1111 , 4534 , 4563};
int result = binfind(nums , sizeof(nums) / sizeof(nums[0]) , 45);
if (result < 0)
{
printf("查无此数");
}

}

F. C语言二分查找问题,无法出现a[1]

把 while ( left < right ) 改为 while ( left <= right ) 即可。当最后left=right时,循环会继续运行,这时候left已经+1变成1了,(1+1)/2=1,这样a[1]就找到了。

G. 用C语言写二分查找的代码!!!

推荐答案的 code 有问题,并没有考虑到若待查数的下标是 0 怎么办?所以若顺序表中不存在待查元素应该 return-1

加上主函数的最后两行调用两次查找函数很多余,代码显得不够简练。

建议改成:

#include<stdio.h>
#include<stdlib.h>

intSearch(int*a,intkey)
{
//在顺序表中折半查找key的数据元素。若找到,则函数值为
intlow=0,mid;//该元素的数组下标;否则为0。
inthigh=14;
while(low<=high)
{
mid=(low+high)/2;
if(key==a[mid])
returnmid;//找到待查元素
elseif(key<a[mid])
high=mid-1;//继续在前半区间进行查找
else
low=mid+1;//继续在后半区间进行查找
}
return-1;//顺序表中不存在待查元素
}
voidmain()
{
int*a,key,i;
intb[15]={0};
a=b;

printf("请自小到大输入15个整数: ");
for(i=1;i<=15;i++)
{
scanf("%d",&b[i-1]);
printf(" ");
}
printf("请输入你要查找的数: ");
scanf("%d",&key);
i=Search(a,key);
if(-1==i)
printf("你要查找的数不在目标数组中! ");
else
printf("你要查找的数的数组下标为%d ",i);
}

H. c语言编程二分查找

好久不写了

写一个程序,建立N元整型数组,然后输入查找的整数x,查找x是否包含在数组中,查找用函数实现,若查找成功,返回x在数组中的第一次出现的下标,查找失败,返回-1

源程序:
#include"stdio.h"
#define N 10
int locate(int a[N],int x)
{int h,r,m;
h=0;r=N-1;m=(h+r)/2;
while(h<=r&&x!=a[m])
if(x<a[m]) {r=m-1;m=(h+r)/2;}
else {h=m+1;m=(h+r)/2;}
if(h>r) return -1; /*查找失败,返回-1*/
return m; /*查找成功,返回有效下标m */
}
void upinsert(int a[],int i) /*插入排序 (升序)*/
{int x,j;
x=a[i];j=i-1;
while(j>=0&&a[j]>x) {a[j+1]=a[j];j--;}
a[j+1]=x;
}
void main()
{int a[N],x,k,n;
printf("input %d integers:\n",N);
for(k=0;k<N;k++) {scanf("%d",a+k);upinsert(a,k);}
printf("input x=") ;scanf("%d",&x);
n=locate(a,x);
for(k=0;k<N;k++) printf("%4d",a[k]);
printf("\n fist position=%d\n",n);
}

没有错误,我试过了

I. 用C语言编写顺序查找和二分查找(折半查找)

#include<stdio.h>
#defineLENGTH20

voidSequenceSearch(int*fp,intLength);
voidSearch(int*fp,intlength);
voidSort(int*fp,intlength);

voidmain()
{
intcount;
intarr[LENGTH];

printf("请输入你的数据的个数: ");
scanf("%d",&count);
printf("请输入%d个数据 ",count);
for(inti=0;i<count;i++)
{
scanf("%d",&arr[i]);
}

intchoise=0;
do
{
printf("1.使用顺序查询. 2.使用二分查找法查找. 3.退出 ");
scanf("%d",&choise);

if(choise==1)
SequenceSearch(arr,count);
elseif(choise==2)
Search(arr,count);
elseif(choise==3)
break;
}while(choise==1||choise==2||choise==3);
}

voidSequenceSearch(int*fp,intLength)
{
intdata;
printf("开始使用顺序查询. 请输入你想要查找的数据. ");
scanf("%d",&data);

for(inti=0;i<Length;i++)
if(fp[i]==data)
{
printf("经过%d次查找,查找到数据%d. ",i+1,data);
return;
}

printf("经过%d次查找,未能查找到数据%d. ",i,data);
}

voidSearch(int*fp,intlength)
{
intdata;
printf("开始使用顺序查询. 请输入你想要查找的数据. ");
scanf("%d",&data);
printf("由于二分查找法要求数据是有序的,现在开始为数组排序. ");
Sort(fp,length);
printf("数组现在已经是从小到大排列,下面将开始查找. ");

intbottom,top,middle;

bottom=0;
top=length;

inti=0;
while(bottom<=top)
{
middle=(bottom+top)/2;
i++;
if(fp[middle]<data)
{
bottom=middle+1;
}
elseif(fp[middle]>data)
{
top=middle-1;
}
else
{
printf("经过%d次查找,查找到数据%d. ",i,data);
return;
}
}
printf("经过%d次查找,未能查找到数据%d. ",i,data);
}

voidSort(int*fp,intlength)
{
printf("现在开始为数组排序,排列结果将是从小到大. ");

inttemp;
for(inti=0;i<length;i++)
for(intj=0;j<length-i-1;j++)
if(fp[j]>fp[j+1])
{
temp=fp[j];
fp[j]=fp[j+1];
fp[j+1]=temp;
}

printf("排序完成! 下面输出排序后的数组: ");
for(intk=0;k<length;k++)
{
printf("%5d",fp[k]);
}
printf(" ");

}

J. 用递归的方式实现二分查找c语言

#include <stdio.h>
int a[100]= {1,2,3,5,11,12,14,15,29,55}; //数组中的数(由小到大)
int k;//要找的数字
int found(int x,int y)
{ int m=x+(y-x)/2;
if(x>y)//查找完毕没有找到答案,返回-1
return -1;
else
{ if(a[m]==k) return m;//找到就返回位置.
else if(a[m]>k) return found(x,m-1);//找左边
else return found(m+1,y);//找右边
}
}
int main()
{ scanf("%d",&k);//输入要找的数字
printf("%d\n",found(0,9));//从数组a[0]到a[9]进行查找
return 0;
}

热点内容
加密和黎曼猜想 发布:2024-11-08 05:33:08 浏览:419
中央编译出版社一年的销售额 发布:2024-11-08 05:32:15 浏览:561
c语言结构体位域 发布:2024-11-08 05:31:00 浏览:552
androidv7包 发布:2024-11-08 05:26:41 浏览:540
停止共享文件夹脚本 发布:2024-11-08 05:20:54 浏览:39
查看数据库的sid 发布:2024-11-08 05:16:47 浏览:830
菲斯塔dlxdct是哪个配置 发布:2024-11-08 05:06:09 浏览:212
profile怎么配置 发布:2024-11-08 05:06:07 浏览:377
一键安装linux 发布:2024-11-08 05:04:36 浏览:788
lol直播什么配置要求 发布:2024-11-08 05:04:33 浏览:951