折半查找c語言
㈠ c語言中的折半查找法是什麼原理
剛開始的時候數組時排好順序的:從小到大,或者從大到小。然後將這個數組折中,用中間的這個數和要查找的數比較大小,(例如:如果我從小到大,我將數組這種後,用中間的數和要查找的數比較,如果小,則那個要查找的數絕對在中間靠左的范圍里,如果大,則那個要查找的數絕對在中間靠右的范圍里,然後同理,慢慢慢慢縮小范圍,知道查找到為止)
㈡ 用c語言實現折半查找
#include<stdio.h>
int find(int a[],int x,int n,int m)
{int i;
if(n>m)return -1;
i=(n+m)/2;
if(a[i]==x)return i;
if(a[i]>x)return find(a,x,n,i-1);
return find(a,x,i+1,m);
}
int main()
{
int a[20]={2,3,6,7,12,18,19,21,25,28,30,33,37,39,42,45,47,49,50,51};
int x,i;
printf("已有的數是: ");
for(i=0;i<20;i++)
printf("%d ",a[i]);
printf(" 請輸入要查找的數:");
scanf("%d",&x);
if((i=find(a,x,0,19))>=0)
printf("%d是第%d個數 ",x,i+1);
else printf("未找到%d ",x);
return 0;
}
㈢ C語言折半查找法詳細代碼(假如有10個已排好序的數)
折半查找即二分查找,思想是:在一組有序的數據中查找一個數據,首先將要查找的數據與這組數中間的值比較,如果要查找的數據比它小,則在左半部分中繼續查找;若比中間值大,則在右半部分中繼續查找,相等的話就表示已找到,直接返回。
這樣,每次查找都可以將查找范圍縮小一半,以此達到O(log N)的時間復雜度。
折半查找代碼如下:
intbsearchWithoutRecursion(intarray[],intlow,inthigh,inttarget)
{
while(low<=high)
{
intmid=(low+high)/2;
if(array[mid]>target)
high=mid-1;
elseif(array[mid]<target)
low=mid+1;
else
returnmid;
}
return-1;
}
㈣ c語言的折半查找法
你的數組的索引為0-14
所以你可以設兩個變數
這兩個變數a,b是用來限制你要的數的范圍的
一開始a=0 b=14
接著取索引為int((a+b)/2 )的元素與你輸入的比較
如果比輸入的小的話那麼設a=int(a+b)/2 )
接著繼續取索引為int((a+b)/2 )的元素與你輸入的比較
如果比輸入的大的話那麼設b=int(a+b)/2 )繼續找下去 如果相等的話就列印並break
不然一直到a=b退出循環
㈤ C語言中的折半查找法是什麼
折半查找的前提是已經對數據做好了排序,然後再折半查找
例如排序後的數據是1 5 12 35 64 78 89 123 456
你要查找12,首先用12跟上面排好順序的9個數中間那個比較(64),12<64,因此你查找的數據在前半部分,即
1 5 12 35 64,再用12跟前半部分中間那個數比較(12),這樣找了2次就找到了
折半查找的目的是提高查找的效率 折半查找法也稱為二分查找法,它充分利用了元素間的次序關系,採用分治策略,可在最壞的情況下用O(log n)完成搜索任務。
【基本思想】
將n個元素分成個數大致相同的兩半,取a[n/2]與欲查找的x作比較,如果x=a[n/2]則找到x,演算法終止。如果x<a[n/2],則我們只要在數組a的左半部繼續搜索x(這里假設數組元素呈升序排列)。如果x>a[n/2],則我們只要在數組a的右半部繼續搜索x。
二分搜索法的應用極其廣泛,而且它的思想易於理解。第一個二分搜索演算法早在1946 年就出現了,但是第一個完全正確的二分搜索演算法直到1962年才出現。Bentley在他的著作《Writing Correct Programs》中寫道,90%的計算機專家不能在2小時內寫出完全正確的二分搜索演算法。問題的關鍵在於准確地制定各次查找范圍的邊界以及終止條件的確定,正確地歸納奇偶數的各種情況,其實整理後可以發現它的具體演算法是很直觀的。 剛開始的時候數組時排好順序的:從小到大,或者從大到小。然後將這個數組折中,用中間的這個數和要查找的數比較大小,(例如:如果我從小到大,我將數組這種後,用中間的數和要查找的數比較,如果小
㈥ C語言中的「折半查找法」是什麼
折半查找法也稱為二分查找法,它充分利用了元素間的次序關系,採用分治策略,可在最壞的情況下用O(log n)完成搜索任務。
例如排序後的數據是1 5 12 35 64 78 89 123 456
你要查找12,首先用12跟上面排好順序的9個數中間那個比較(64),12<64,因此你查找的數據在前半部分,即1 5 12 35 64,再用12跟前半部分中間那個數比較(12),這樣找了2次就找到了
折半查找的目的是提高查找的效率!
㈦ 折半查找的演算法怎麼寫 C語言
#include<stdio.h>
void main()
{
int in[15],ins,i,k=14,j=0;
printf("請按照從小到大的順序輸入15個數\n");
for(i=0;i<15;i++) scanf("%d",&in[i]);
printf("請輸入要查找的數:");
scanf("%d",&ins);
i=(j+k)/2;
while(j<=k)
{
if(in[i]>ins)
k=i-1;
else
if(in[i]<ins)
j=i+1;
else break;
i=(j+k)/2;
}
printf("你查找的是其中的第%d個數。",i+1);/*i是他的存儲的順序數,i+1才是他在輸入數組中的位置數*/
}
㈧ C語言折半查找法
#include<stdio.h>
int main()
{
char a[12]="abcdefklmnp",ch;
int i,top,bot,mid;
printf("Input a character ");
scanf("%c",&ch);
printf("ch=%c ",ch);
top=11;
bot=0;
mid=(top+bot)/2;
while(bot<=top&&a[mid]!=ch)
{if(a[mid]>ch)top=mid-1;
else if(a[mid]==ch)break;
else bot=mid+1;
mid=(top+bot)/2;
}
if(a[mid]==ch)printf("第%d個字元就是%c ",mid+1,ch);
if(bot>top)printf("該字元不存在a中 ");
return 0;
}
㈨ c語言編程實現「折半查找」的過程。
//參考代碼如下:
#include <stdio.h>
int main()
{
int i, j, n, k=0, isFound=0;
int num[15] = {88,86,75,74,61,56,52,43,39,34,31,22,18,16,8}; //測試數組
printf("請輸出一個整數:\n");
scanf("%d", &n);
i = (int)15/2; //對折位移量
j = (int)15/2; //取數「指針」
while(k<2)
{
i = (int)i/2;
if(i == 0) k++; //i==0 即折半到無可再折時,仍有最後一次比較,故以k做計數
//若未相等,計算下一循環指針的位置
if(n<num[j])
j = j + (i + 1);
else if(n>num[j])
j = j - (i + 1);
else
{
isFound = 1;
break; //若找到相等數,標記已找到並退出循環
}
}
//輸出結果
if(isFound)
printf("該數是數組中第%d個元素的值\n", j);
else
printf("查無此數!\n");
return 0;
}
㈩ c語言折半查找 求助大佬
#include <stdio.h>
void sort(int a[],int n)
{
int i,j,t;
for(i=0;i<n-1;++i)
{
for(j=0;j<n-i-1;++j)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
int search(int a[],int n, int s)
{
int i,j;
for(i=0,j=n-1;printf("%5d",(i+j)/2),i<j;)
{
if(a[(i+j)/2]<s)
i=(i+j)/2+1;
else
j=(i+j)/2-1;
}
return a[(i+j)/2]==s?(i+j)/2:-1;
}
int main()
{
int a[10],i,s;
for(i=0;i<10;++i)
scanf("%d",&a[i]);
scanf("%d",&s);
sort(a,10);
for(i=0;i<10;++i)
printf("%5d",a[i]);
printf(" ");
printf(" %s",search(a,10,s)>=0?"Success":"Fail");
return 0;
}