c語(yǔ)言中文二分搜索函數(shù) C語(yǔ)言二分搜索

C語(yǔ)言二分查找法

#include stdio.h

創(chuàng)新互聯(lián)提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì),品牌網(wǎng)站設(shè)計(jì)廣告投放等致力于企業(yè)網(wǎng)站建設(shè)與公司網(wǎng)站制作,10多年的網(wǎng)站開發(fā)和建站經(jīng)驗(yàn),助力企業(yè)信息化建設(shè),成功案例突破近千家,是您實(shí)現(xiàn)網(wǎng)站建設(shè)的好選擇.

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("查無此數(shù)");

}

}

用C語(yǔ)言編二分查找

#includestdio.h

#includestdlib.h

#includetime.h

void xuanzhe(int a[], int n)

{

int i, j, min, t;

for (i=0; in-1; i++) /*要選擇的次數(shù):0~n-2共n-1次*/

{

min = i; /*假設(shè)當(dāng)前下標(biāo)為i的數(shù)最小,比較后再調(diào)整*/

for (j=i+1; jn; j++)/*循環(huán)找出最小的數(shù)的下標(biāo)是哪個(gè)*/

{

if (a[j] a[min])

{

min = j; /*如果后面的數(shù)比前面的小,則記下它的下標(biāo)*/

}

}

if (min != i) /*如果min在循環(huán)中改變了,就需要交換數(shù)據(jù)*/

{

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("沒有你要找的數(shù)\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("沒有你要找的數(shù)\n");

printf("%fs\n",(clock()-y)/CLOCKS_PER_SEC);

}

用C語(yǔ)言創(chuàng)建一個(gè)二分查找函數(shù)

排序(冒泡)

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");

再來一個(gè)快速排序

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; //第一個(gè)比他小

{

student tmp=arr[i];

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

arr[j]=tmp;

i++;

}

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

{

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語(yǔ)言遞歸函數(shù)如何實(shí)現(xiàn)二分搜索算法

折半查找法也稱為二分查找法,它充分利用了元素間的次序關(guān)系,采用分治策略,可在最壞的情況下用O(log n)完成搜索任務(wù)。它的基本思想是,已知一個(gè)有n個(gè)元素的有序序列, 將n個(gè)元素分成個(gè)數(shù)大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,算法終止。如果xa[n/2],則我們只要在數(shù)組a的左半部繼續(xù)搜索x(這里假設(shè)數(shù)組元素呈升序排列)。如果xa[n/2],則我們只要在數(shù)組a的右半部繼續(xù)搜索x, 直到找到x或者是沒有找到!

如果是常規(guī)的方法的話那么我們可以通過循環(huán)的方式, 按照上面說的算法, 找到則退出循環(huán), 否則繼續(xù)循環(huán)直到左下標(biāo)位置小于或者等于右下標(biāo)的位置.

按兄弟你的意思是要用遞歸方法進(jìn)行搜索, 那么大概還是上面的算法, 只是把循環(huán)的方式改成遞歸方式: 如果沒找到,則確定新的搜索范圍, 即左右下標(biāo)新位置, 然后把新的參數(shù)傳給函數(shù)繼續(xù)調(diào)用函數(shù)進(jìn)行遞歸搜索!!

遞歸方式實(shí)現(xiàn)詳細(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};//假設(shè)一個(gè)已知的有序且是升序數(shù)列

int result = 0;//查找的結(jié)果

int x = 13;//假設(shè)我們要查找的數(shù)是13

int left = 0;//序列開始下標(biāo)

int right = ARRAY_SIZE - 1;//序列結(jié)尾下標(biāo)

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;

}

希望對(duì)兄弟你有幫助!

用C語(yǔ)言寫二分查找的代碼?。。?/h2>

推薦答案的 code 有問題,并沒有考慮到若待查數(shù)的下標(biāo)是 0 怎么辦?所以若順序表中不存在待查元素?應(yīng)該 return?-1

加上主函數(shù)的最后兩行調(diào)用兩次查找函數(shù)很多余,代碼顯得不夠簡(jiǎn)練。

建議改成:

#include?stdio.h

#include?stdlib.h

int?Search(int?*a,?int?key)

{

//?在順序表中折半查找?key的數(shù)據(jù)元素。若找到,則函數(shù)值為

int?low?=?0,?mid;?//?該元素的數(shù)組下標(biāo);否則為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;?//?繼續(xù)在前半?yún)^(qū)間進(jìn)行查找

else

low?=?mid?+?1;?//?繼續(xù)在后半?yún)^(qū)間進(jìn)行查找

}

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

}

void?main()

{

int?*a,?key,?i;

int?b[15]?=?{0};

a?=?b;

printf("請(qǐng)自小到大輸入15個(gè)整數(shù):\n");

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

{

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

printf("\n");

}

printf("請(qǐng)輸入你要查找的數(shù):\n");

scanf("%d",?key);

i?=?Search(a,?key);

if?(-1?==?i)

printf("你要查找的數(shù)不在目標(biāo)數(shù)組中!\n");

else

printf("你要查找的數(shù)的數(shù)組下標(biāo)為?%d?\n",?i);

}

c語(yǔ)言編程二分查找

好久不寫了

寫一個(gè)程序,建立N元整型數(shù)組,然后輸入查找的整數(shù)x,查找x是否包含在數(shù)組中,查找用函數(shù)實(shí)現(xiàn),若查找成功,返回x在數(shù)組中的第一次出現(xiàn)的下標(biāo),查找失敗,返回-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; /*查找成功,返回有效下標(biāo)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);

}

沒有錯(cuò)誤,我試過了

網(wǎng)頁(yè)題目:c語(yǔ)言中文二分搜索函數(shù) C語(yǔ)言二分搜索
路徑分享:http://www.muchs.cn/article4/dooddoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)自適應(yīng)網(wǎng)站、微信小程序、、搜索引擎優(yōu)化、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管