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

c语言二分查找归序

发布时间: 2022-05-10 06:51:19

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语言如何实现-数组排序,二分查找

给定已经排好序的n个元素,现在要在这n个元素中找出一特定元素x。顺序搜索的方法是逐个比较,直至找出元素。二分搜索则利用了元素间的次序关系,可大大提高效率。二分法的基本思想是将n个元素分成个数大致相同的两半,取a[n/2]与x作比较。如果x==a[n/2],则终止。如果x<a[n/2],则只需在数组的左半部分继续搜索。如果x>a[n/2],则只需在右半部分搜索。本题要求利用上一题得到的数组进行顺序查找和二分查找,分别为两种查找方法计时。
#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语言编程二分查找

好久不写了

写一个程序,建立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语言代码

二分查找:
int search(int a[],int x,int n)
{
int mid=0;
int low=0;
int high=n;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)
{ return mid; }
else if(x<a[mid])
{ high=mid-1; }
else
{ low=high+1; }
}
return -1;
}
顺序查找:
int search(int a[],int x,int n)
{
int i;
for(i=0;i<n;i++)
{
if(a[i]==x)
return i;
else
return -1;
}
}

㈤ 用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语言怎么用二分查找插入排序

进行二分查找的前提是数组已排序,这里假定数组递增排序。

每次查找都将待查找数num与处于数组中间位置a[mid]的数进行比较,num < a[mid]则在mid之前的元素中进行查找,反之在mid之后的元素中进行查找。

在函数中使用low, mid, high来对待查找的范围来进行标记。

参考代码如下:

/*整数查找*/
voidbinsearch(intnum,inta[],intlength)/*num为待查找数字,length为数组a的长度*/
{
intlow,mid,high;
low=0;
high=length-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]>num)
high=mid-1;
elseif(a[mid]<num)
low=mid+1;
else
returnmid;
}
return-1/*未查找到num返回-1*/
}

㈦ C语言 二分法查找 排序问题

a.txt:读入数据

b.txt: 写入排序数据

c.txt: 写入查找结果

#include<stdio.h>

constintmaxn=1000;
intnum[maxn],n;


voidswap(int*x,int*y){
*x^=*y;
*y=*x^*y;
*x=*x^*y;
}

voidfinput(){
printf("-------- readdatafroma.txt -------- ");
FILE*fin=fopen("a.txt","r");
n=0;
while(fscanf(fin,"%d",&num[n])!=EOF){
n++;
}
fclose(fin);
}


voidbubble(){
printf("-------- startbubblingsortalgorithm ");
for(inti=n-1;i>0;--i){
for(intj=0;j<i;++j){
if(num[j]>num[j+1]){
swap(&num[j],&num[j+1]);
}
}
}

printf("writetheresultofsortinb.txt -------- ");
FILE*fout=fopen("b.txt","w");
for(inti=0;i<n;++i){
fprintf(fout,"%d ",num[i]);
}
fclose(fout);
}

intrbesearch(intlow,inthigh,intv){
//recursivebinarysearch
//returntheindexofv.ifnotexists,return-1.
if(low==high){
if(num[low]==v)returnlow;
return-1;
}
if(num[low]==v)returnlow;
intmid=(low+high)/2;
if(num[mid]<v){
returnrbesearch(mid+1,high,v);
}
else{
returnrbesearch(low,mid,v);
}
}

intnrbesearch(intlow,inthigh,intv){
//non-recursivebinarysearch
//returntheindexofv.ifnotexists,return-1.
while(low<high){
intmid=(low+high)/2;
if(num[mid]<v){
low=mid+1;
}
else{
high=mid;
}
}
if(low==high&&num[low]==v){
returnlow;
}
return-1;
}


voidsearch(){
printf("-------- ");
printf("Startsearch. ");
printf("Theresultswillbewritteninc.txt ");
printf("pleaseinputanum.ifnum=-123456,quit. ");

FILE*file=fopen("c.txt","w");
while(true){
intv;
scanf("%d",&v);
if(v==-123456)break;

intrb=rbesearch(0,n-1,v);
intnrb=nrbesearch(0,n-1,v);

fprintf(file,"input:%d ",v);
fprintf(file,":%d ",rb);
fprintf(file,"theresultofnon-recursivebinarysearch:%d ",nrb);

printf(":%d ",rb);
printf("theresultofnon-recursivebinarysearch:%d ",nrb);
}
fclose(file);

}

intmain(){
finput();
bubble();
search();
return0;
}

㈧ 用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(" ");

}

㈨ 用递归的方式实现二分查找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;
}

㈩ C语言问题求解,二分查找

二分查找也称折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

#include <stdio.h>

int cnt;

int binfind(int a[],int l,int r,int x)

{ cnt++;

int m=(l+r)/2;

if(l>m)return -1;

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

if(x>a[m])return binfind(a,m+1,r,x);

return binfind(a,l,m-1,x);

}

int main()

{ int n,i,x,a[100];

scanf("%d",&n);

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

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

scanf("%d",&x);

i=binfind(a,0,n-1,x);

printf("%d %d ",i,cnt);

return 0;

}