当前位置:首页 » 编程语言 » 用c语言实现二分法查找的算法
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

用c语言实现二分法查找的算法

发布时间: 2023-02-13 14:52:57

‘壹’ c语言如何用二分法查找一个数.我要一个例题

//二分法查找一个数,原数列必须是有序的,
//有个问题,当数列中有相同的数怎么处理,也就是只找到其中一个

void binsrch( int m[N],int k){
int low,high,mid;
low=0;high=N-1;
while (low<=high){
mid=(low+high)/2;
if (k>m[mid])
high=mid-1;
if (k<m[mid])
low=mid+1;
if (k==m[mid]){
printf("找到此数在数组的%d位,值为%d",mid+1,k);
return;
}

}
printf("没有找到此数,非常报歉");
return;

}

‘贰’ 求二分法查找演示C语言源代码

二分法查找算法:

1.主要思想是:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。


2. 时间复杂度: O(log2n)。


3. C语言源代码(小例子)

search函数即为核心代码:递归查找

#include<stdio.h>
intsearch(int*a,intnum,intlow,inthigh)
{
intmid=(low+high)/2;
if(low<=high)
{
if(num<a[mid])
returnsearch(a,num,low,mid-1);//加return
if(num>a[mid])
returnsearch(a,num,mid+1,high);//加return
if(num==a[mid])
return1;
}
else
return0;
}
intmain(){
inta[11]={0,1,2,3,4,5,9,11,12,13,15};
if(search(a,11,0,10)==1)
printf("success!!");
else
printf("failed!!");
}

‘叁’ c语言中如何在链表内使用二分法查找

对于无序的链表,还是沿着头结点顺序查找比较好。
如果要用二分法查找,则先将该链表进行排序,以下是我用冒泡法对单链表进行的排序:
/*单链表排序(mark=1,降序;mark=0,升序)*/
void SortList(LNode *L,int mark)
{
int i,j,change=TRUE;
ElemType temp;
LNode *p=L->next,*q;
if(p && (p->next)) //如果单链表长度<2,则不用排序
{
for(j=1;j<L->data && change;j++)
{
change=FALSE;
p=L->next;
q=p->next;
for(i=0;i<L->data-j;i++)
{
if((q->data>p->data && mark) || (q->data<p->data && (!mark)))
{
temp=p->data;
p->data=q->data;
q->data=temp;
change=TRUE;
}
p=q;
q=q->next;
}
}
}
printf("排序成功\r\n");
}
/*从链表的第curI个点处开始查找第i个结点,前提:i>curI*/
LNode *GetElem2(LNode *L,int curI,int i)
{
LNode *p=L;
while(p=p->next)
if(i==(++curI)) {
return p;
}
return NULL;
}
/*对排序后的链表进行二分法查找*/
int DichotomyList(LNode *L,ElemType e)
{
LNode *p=L;
int cur=0;//cur用来保存当前的位置结点,避免每次定位结点都从头结点开始
int left=1,right=L->data;//我定义的链表,其头结点的数据域保存着链表的长度
int mid=(left+right)/2;
//SortList(L,0);
while(left<=right && (p=GetElem2(p,cur,mid))->data!=e)
{
if(p->data>e) {cur=0;p=L;right=mid-1;mid=(left+right)/2;}
else {cur=mid;left=mid+1;mid=(left+right)/2;}
}
if(p->data==e) {printf("find node in %d.\r\n",mid);return mid;}
else {printf("find none.\r\n");return 0;}
}
经VC上测度通过

如果你要完整的程序的话,留个邮箱,我发给你

‘肆’ 怎么用C语言求二分法

二分法查找有一个前提,数据应该是排好序的,假设从小到大排列,则:
首先用中间那个数(也可以不是正中间,差一两位没有关系,只要保证不忽略数据就行)与查找值比较,大于查找值就跳到左边。
然后重新设定新的数列。新的数列为,从最小的数值到中间那个数。
以这个新的数列为基础,重复以上步骤。

‘伍’ c语言,二分法查找

intsearch(intnumber,int*arr,intsize)
{
intx=-1;
intleft=0;
intlast=size-1;
while(left<=last)
{
intmid=(left+last)/2;
if(number>arr[mid])
{
left=mid+1;
}
elseif(number<arr[mid])
{
last=mid-1;
}
else
{
x=mid;
break;
}

}
returnx;
}
intmain()
{
intnumber=14;
intarr[]={1,5,14,18,44,88,24,999,42,17,9,5,1};
inty=sizeof(arr)/sizeof(int);
printf("arr[%d] ",search(number,arr,sizeof(arr)/sizeof(int)));
}

‘陆’ 用C语言编写非递归算法实现折半查找(二分查找)

char
a[10][5];//按字典序递增
int
search(char
*x)//二分查找,返回有序表中大于等于x的元素位置
{
int
low=0,high=9,mid,t;
while(low<=high)
{
mid=(low+high)/2;
t=strcmp(a[mid],x);//比较中点位置与x
if(t==0)
return
mid;//相等返回其位置
else
if(t>0)
high=mid-1;//x小于mid元素,则在中点前
else
low=mid+1;
}
return
high+1;//返回大于x的第一个元素
}
这个是我曾经用过的字符串的二分查找~
请根据需要修改数据类型。。。

‘柒’ 谁能用c语言帮我写个二分法的查找程序

#include<stdlib.h>
void
sort(int
a[],int
n){
/*排序函数,要使用二分法查找就必须对数组进行排序*/
int
i,k;
for(i=0;i<n;i++){
int
min=i;
for(k=i+1;k<n;k++)
if(a[min]>a[k])min=k;
if(i!=min){
a[min]+=a[i];/*这里是运用加减法交换两个数*/
a[i]=a[min]-a[i];
a[min]-=a[i];
}
}
}
int
find(int
a[],int
n,int
key){/*二分法查找;参数:数组名,数组长度,查找关键字*/
int
min=0,max=n-1;/*二分法查找头尾变量*/
while(min<max){/*如果最头的变量值大于最尾变量的值,则查找不到,查找失败*/
int
cen
=
(min+max)/2;
if(a[cen]==key)
return
cen;/*如果查到,则返回关键字在排序数组的下标*/
if(cen==min
||
cen==max)break;/*如果中间变量等于头尾任一个变量,同样查找失败*/
if(a[cen]>key)
max=cen;
else
min=cen;
}
return
-1;
}
void
main(){/*主程序只是为了证明两个函数的可行性,可以自己编写*/
int
a[]={14,10,25,36,87,95,10,12,13,8},i;
sort(a,10);
i=find(a,10,11);
if(i!=-1)
printf("be
found");
else
printf("no
found");
getch();
}

‘捌’ 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);
}

没有错误,我试过了

‘玖’ C语言二分法查找

#include <stdio.h>//不用math头文件

void main()
{int high = 9,low = 0,m,k,a[10]={1,2,3,4,5,6,7,8,9,10};//hing和low赋初值
scanf("%d",&k);
while (high>=low)//>=
{
m=(high+low)/2;
if(k<a[m]) high=m-1;//比较的是数值而不是下标
else if(k>a[m]) low=m+1;
else
{
printf("yes");
return;//这两句地方放错了
}
}

printf("no");
return;//if语句去掉
}