⑴ 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语句去掉
}
⑵ 用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);
}
⑶ 用C语言编二分查找
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void xuanzhe(int a[], int n)
{
int i, j, min, t;
for (i=0; i<n-1; i++) /*要选择的次数:0~n-2共n-1次*/
{
min = i; /*假设当前下标为i的数最小,比较后再调整*/
for (j=i+1; j<n; j++)/*循环找出最小的数的下标是哪个*/
{
if (a[j] < a[min])
{
min = j; /*如果后面的数比前面的小,则记下它的下标*/
}
}
if (min != i) /*如果min在循环中改变了,就需要交换数据*/
{
t = a[i];
a[i] = a[min];
a[min] = t;
}
}
}
int main(){
int i,n,x;
int mid,left=0,right=999;
int find1=0,find2=0;
double y;
int a[1000];
for(i=0;i<1000;++i){
a[i]=rand();
}
xuanzhe(a,1000);
scanf("%d",&x);
printf("顺序查找:\n");
for(i=0;i<1000;++i){
while(x==a[i]){
printf("找到X=%d,a[%d]\n",x,i);
find1=1;
break;
}
}
if(find1==0){
printf("没有你要找的数\n");
}
printf("%fs\n",clock()/CLOCKS_PER_SEC);
y=clock();
printf("二分查找:\n");
while(!find2&&left<right)
{
mid=(left+right)/2;
if(x==a[mid])
find2=1;
else if(x<a[mid])
right=mid-1;
else left=mid+1;
}
if(find2==1)
printf("找到x=%d ,a[%d]\n",x,mid);
else
printf("没有你要找的数\n");
printf("%fs\n",(clock()-y)/CLOCKS_PER_SEC);
}
⑷ C语言二分查找
#include<stdio.h>
#include<string.h>
intBinarysearch(intw[],intn,intx){
intm,high=n-1,low=0;
while(low<=high){
m=(low+high)/2;
if(x==w[m])returnm;
elseif(x>w[m])high=m-1;
elselow=m+1;
}
return-1;
}
intmain(){
inti,j,n,t,index,scr;
charname[1000][23],tmp[23];
intscore[1000];
printf("输入要统计的学生个数:");
scanf("%d",&n);
for(i=0;i<n;++i){
printf("姓名成绩:");
scanf("%s%d",name[i],&score[i]);
}
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++){
if(score[j]<score[j+1]){
t=score[j];
score[j]=score[j+1];
score[j+1]=t;
strcpy(tmp,name[j]);
strcpy(name[j],name[j+1]);
strcpy(name[j+1],tmp);
}
}
}
printf("学生姓名和C语言课程的成绩从高到低输出: ");
for(i=0;i<n;++i)
printf("%s %d ",name[i],score[i]);
printf(" 输入要查找的成绩:");
scanf("%d",&scr);
index=Binarysearch(score,n,scr);
if(index>=0)printf("%s %d ",name[index],score[index]);
return0;
}
⑸ 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("查无此数");
}
}
⑹ 二分查找(C语言实现)
二分查找是一种简单高效的查找算法。其思想在生活中广泛应用,比如从图书馆书架上查找书,查字典,测量领域中热电偶温度补偿等。
二分查找可以用 循环 和 递归 两种方式实现
⑺ C语言二分查找
我记得二分查找是要用到递归的,
你把代码写到main函数里面而main又是不允许被其他函数调用(不能递归的)
所以....出错了,
要改的话,建议你把二分的部分单独抽取出来,写个函数(要用到递归)然后在main里面调用.
⑻ C语言二分查找
if(key==a[mid]) return mid; 这句就是罪魁祸首。呵呵你是想用return来结束while循环吧。用错了。
找到结果后,你应该是把结果输出出来,而不是用return。return语句是返回整个函数的,在你的程序里main函数就结束了,你当然看不到任何结果了。
改为:
if(key==a[mid]) break; *这行是结束while循环的。而不是你所用的return*/
}
⑼ 二分查找 C语言
这最后一个语句写错了:
printf("您输入的数组是");for(i=0;i<n;i++){printf("%d",&a[i]);}
应该是:
printf("您输入的数组是");for(i=0;i<n;i++){printf("%d ",a[i]);} //要有空格,不要有取地址符
⑽ 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);
}
没有错误,我试过了