c语言中文二分搜索函数 C语言二分搜索

C语言二分查找法

#include stdio.h

创新互联提供成都网站设计、成都做网站、网页设计,品牌网站设计广告投放等致力于企业网站建设与公司网站制作,10多年的网站开发和建站经验,助力企业信息化建设,成功案例突破近千家,是您实现网站建设的好选择.

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语言编二分查找

#includestdio.h

#includestdlib.h

#includetime.h

void xuanzhe(int a[], int n)

{

int i, j, min, t;

for (i=0; in-1; i++) /*要选择的次数:0~n-2共n-1次*/

{

min = i; /*假设当前下标为i的数最小,比较后再调整*/

for (j=i+1; jn; 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;i1000;++i){

a[i]=rand();

}

xuanzhe(a,1000);

scanf("%d",x);

printf("顺序查找:\n");

for(i=0;i1000;++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(!find2leftright)

{

mid=(left+right)/2;

if(x==a[mid])

find2=1;

else if(xa[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语言创建一个二分查找函数

排序(冒泡)

void(student*tmp,int size)

{

for(int j=0;jn-1;j++)

{

for(k=0;kn-1-j;k++)

{

if(strcmp(tmp[k].name,tmp[k+1].name)0)

{

student tm=tmp[k];

tmp[k]=tmp[k+1];

tmp[k]=tm;

}

}

}

}

int findOn(student*test,char*name,int begin,int end)

{

if(beginend)

{

return -1;//没找到

}

int mid=end+((end-begin)/2);

if(strcmp(test[mid].name,name)==0)

{

return mid;

}elseif((strcmp(test[mid].name,name)0)

{

return findOn(test,name,mid+1,end);

}else

{

return findOn(test,name,begin,mid-1);

}

}

int find(student *test,int size,char* studentname)

{

return findOn(test,strudentname,0,size-1);

}

find(student,3000,"testname");

再来一个快速排序

void quickSort(student *test arr,int startPos, int endPos)

{

int i,j;

student key;

key=arr[startPos];

i=startPos;

j=endPos;

while(ij)

{

while(strcmp(arr[j].name,key.name)=0 ij)--j; //第一个比他小

{

student tmp=arr[i];

arr[i]=arr[j]; //moveed

arr[j]=tmp;

i++;

}

while((strcmp(arr[i].name,key.name)=0 ij)++i; //第一个比他大,

{

student tmp=arr[j];

arr[j]=arr[i];

arr[i]=tmp;

j--;

}

}

arr[i]=key; //赋值

if(i-1startPos) quickSort(arr,startPos,i-1);

if(endPosi+1) quickSort(arr,i+1,endPos);

}

quicksort(test,0,3000-1);

find(student,3000,"testname");

C语言递归函数如何实现二分搜索算法

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,已知一个有n个元素的有序序列, 将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果xa[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果xa[n/2],则我们只要在数组a的右半部继续搜索x, 直到找到x或者是没有找到!

如果是常规的方法的话那么我们可以通过循环的方式, 按照上面说的算法, 找到则退出循环, 否则继续循环直到左下标位置小于或者等于右下标的位置.

按兄弟你的意思是要用递归方法进行搜索, 那么大概还是上面的算法, 只是把循环的方式改成递归方式: 如果没找到,则确定新的搜索范围, 即左右下标新位置, 然后把新的参数传给函数继续调用函数进行递归搜索!!

递归方式实现详细代码如下:

#include stdio.h

#define ARRAY_SIZE 10

#define NOT_FOUND -1

int BinarySearch(int array[], int left, int right, int NumToSearch)

{

int mid = (left + right) / 2;

if (left = right)

{

if (NumToSearch == array[mid])

{

return mid;

}

else if (NumToSearch array[mid])

{

right = mid - 1;

return BinarySearch(array, left, right, NumToSearch);

}

else

{

left = mid + 1;

return BinarySearch(array, left, right, NumToSearch);

}

}

return NOT_FOUND;

}

int main()

{

int a[ARRAY_SIZE] = {2, 5, 6, 7, 13, 20, 22, 27, 112, 222};//假设一个已知的有序且是升序数列

int result = 0;//查找的结果

int x = 13;//假设我们要查找的数是13

int left = 0;//序列开始下标

int right = ARRAY_SIZE - 1;//序列结尾下标

result = BinarySearch(a, left, right, x);

if (result == NOT_FOUND)

{

printf("Not Found!\n");

}

else

{

printf("Found %d in array a, it is a[%d]\n", x, result);

}

return 0;

}

希望对兄弟你有帮助!

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

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

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

建议改成:

#include stdio.h

#include stdlib.h

int Search(int *a, int key)

{

// 在顺序表中折半查找 key的数据元素。若找到,则函数值为

int low = 0, mid; // 该元素的数组下标;否则为0。

int high = 14;

while (low = high)

{

mid = (low + high) / 2;

if (key == a[mid])

return mid; // 找到待查元素

else if (key  a[mid])

high = mid - 1; // 继续在前半区间进行查找

else

low = mid + 1; // 继续在后半区间进行查找

}

return -1; // 顺序表中不存在待查元素

}

void main()

{

int *a, key, i;

int b[15] = {0};

a = b;

printf("请自小到大输入15个整数:\n");

for (i = 1; i = 15; i++)

{

scanf("%d", b[i - 1]);

printf("\n");

}

printf("请输入你要查找的数:\n");

scanf("%d", key);

i = Search(a, key);

if (-1 == i)

printf("你要查找的数不在目标数组中!\n");

else

printf("你要查找的数的数组下标为 %d \n", 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=rx!=a[m])

if(xa[m]) {r=m-1;m=(h+r)/2;}

else {h=m+1;m=(h+r)/2;}

if(hr) return -1; /*查找失败,返回-1*/

return m; /*查找成功,返回有效下标m */

}

void upinsert(int a[],int i) /*插入排序 (升序)*/

{int x,j;

x=a[i];j=i-1;

while(j=0a[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;kN;k++) {scanf("%d",a+k);upinsert(a,k);}

printf("input x=") ;scanf("%d",x);

n=locate(a,x);

for(k=0;kN;k++) printf("%4d",a[k]);

printf("\n fist position=%d\n",n);

}

没有错误,我试过了


分享文章:c语言中文二分搜索函数 C语言二分搜索
当前网址:http://hbruida.cn/article/dooddoe.html