二分查找c語言
A. c語言 二分法查找次數公式怎麼推導
對具有n個元素的有序數組進行二分法查找,要分析的比較次數,可以使用畫二叉判定樹的方法來分析。該二叉判定樹的高度為[log2(n)]+1層,此即為二分查找的最多比較次數,比如:n=1000,則最多比較[log2(1000)]+1=9+1=10次。
如果要計算平均的比較次數,則需要對二叉判定樹中的每個節點進行分析,處於第一層的比較1次,第二層的比較2次,第三層比較3次,依次類推……把各個節點的比較次數累加,再處於節點數(元素個數)即為平均比較次數,這里假設查找是在等概率的情況下進行的。
舉個例子:有9個元素的有序數組,對每個元素按1,2,3...8,9進行編號,則其二叉判定樹如下:
這樣分析,能看懂嗎?希望能幫到你!
B. c語言中如何將順序表排序並實現二分法查找
voidInsertSort(sqR)
這個函數是按值傳遞參數的。換句話說,你的順序表在傳遞的時候被復制了一遍,然後這個函數收到的是一個副本,然後這個程序也許成功排序了這個副本,但是你原來的順序表並沒有改變。你可以考慮傳遞這個順序表的指針。比如這樣
voidInsertSort(sq*pR)
{
sqR=*pR;
//以下不變
...
}
調用的時候傳遞R的地址
InsertSort(&R);
C. C語言二分法查找
二分法查找又稱折半查字法;
思路是.恩!
舉例吧0,1,2,3,4,5,6,7,8中找5取數組中的一半也就是地五個4與5比較,如果4>5(就是中間的那個數比要找的那個大,那麼就取那個數之前的那部分);如果4<5(就是中間的那個數比要找的那個小,就取那個數只後的那部分);如此循環下去;
不好意思,語文沒學好,表達不清楚
D. C語言二分查找
if(key==a[mid]) return mid; 這句就是罪魁禍首。呵呵你是想用return來結束while循環吧。用錯了。
找到結果後,你應該是把結果輸出出來,而不是用return。return語句是返回整個函數的,在你的程序里main函數就結束了,你當然看不到任何結果了。
改為:
if(key==a[mid]) break; *這行是結束while循環的。而不是你所用的return*/
}
E. 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("查無此數");
}
}
F. C語言二分查找問題,無法出現a[1]
把 while ( left < right ) 改為 while ( left <= right ) 即可。當最後left=right時,循環會繼續運行,這時候left已經+1變成1了,(1+1)/2=1,這樣a[1]就找到了。
G. 用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);
}
H. 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);
}
沒有錯誤,我試過了
I. 用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(" ");
}
J. 用遞歸的方式實現二分查找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;
}