二分法c語言
㈠ C語言 二分法查找次數公式怎麼推導
對具有n個元素的有序數組進行二分法查找,要分析的比較次數,可以使用畫二叉判定樹的方法來分析。該二叉判定樹的高度為[log2(n)]+1層,此即為二分查找的最多比較次數,比如:n=1000,則最多比較[log2(1000)]+1=9+1=10次。
如果要計算平均的比較次數,則需要對二叉判定樹中的每個節點進行分析,處於第一層的比較1次,第二層的比較2次,第三層比較3次,依次類推……把各個節點的比較次數累加,再處於節點數(元素個數)即為平均比較次數,這里假設查找是在等概率的情況下進行的。
舉個例子:有9個元素的有序數組,對每個元素按1,2,3...8,9進行編號,則其二叉判定樹如下:
這樣分析,能看懂嗎?希望能幫到你!
㈡ C語言 二分法查找的問題請大家幫我解惑。
最壞的情況應該是log2n向下取整+1,這也是折半查找判定樹(完全二叉樹)的樹高。
第一,題目不嚴謹,這個折半查找可以向上或向下取整(大部分參考書上默認用向下取整來講解),向下取整當然是花4次找到8,而向上取整是3次。
第二,最後剩下一個數的時候,那個數還需不需要比較,從代碼層面來看,不能簡單認為最後剩下的一個數就是所找的數,因為那個數可能並不在序列中,所以最後一次也應該比較。折半查找判定樹也是這么定義的,所查找數字所在層的樹高即比較次數。
至於那個結論,最壞情況下需要比較的次數,是一個等價無窮小的結論而已。因為比較次數是一個整數,結果可能是個小數,如果那個是最壞比較次數的具體答案的話,它還會指明它是向上取整還是向下取整。
㈢ C語言編程二分法
1、打開Python開發工具IDLE,新建『search.py』。
㈣ C語言中二分法的具體程序是什麼呢
舉個例子:
//二分查找法//
#
include
void
main()
{
int
a[16],i,num,flag=0,top,bottom,mid;
//定義一個一維數組a[16]用來存放供查找用的數據,但只用a[1]——a[15]//
//num用來放要查找的數據,flag是表示是否找到的開關變數,top表示查找的起始位置,bottom表示查找的終止位置,mid表示top與bottom的中間位置//
char
goon;
//變數goon為'y'或'Y'時表示繼續下一輪查找,否則終止程序//
printf("請輸入第1個數字:\n");
scanf("
%d",&a[1]);
//依次輸入第二到第十五個數,並要求輸入的數遞減//
for(i=2;i<=15;i++)
{
printf("請輸入第%d個數字:\n",i);
scanf("
%d",&a[i]);
if(a[i]>=a[i-1])
{
printf("請再次輸入,它應該比上一個數小:\n");
scanf("
%d",&a[i]);
}
}
//輸出剛才輸入的數//
printf("你剛才輸入的數是:\n");
for(i=1;i<=15;i++)
printf("
%d",a[i]);
printf("\n");
//查找循環開始//
do
{
printf("現在請輸入你要查找的數:\n");//輸入想要查找的數//
scanf("
%d",&num);
top=15;
bottom=1;
mid=15/2+1;
if(num>a[1]
||
num
0)//如果在規定的范圍內,開始二分法查找//
{
if(num==a[mid])//找到所需數據,退出本層循環//
{
printf("你所要查找的數字是第%d個。\n",mid);
flag=1;
}
else
if(num>a[mid])//如果要查找的數據比a[mid]大,在前半數組查找//
{
top=mid+1;
mid=(top+bottom)/2;
}
else
//如果要查找的數據比a[mid]小,在後半數組查找//
{
bottom=mid-1;
mid=(top+bottom)/2;
}
}
if(flag==0)//如果未找到數據,輸出找不到的信息//
printf("無法找到你要找的數字!\n");
printf("是否繼續查找?(Y/N):\n");//詢問是否開始下一輪查找//
scanf("
%c",&goon);
}while(goon=='y'
||
goon=='Y');
}
㈤ C語言 二分法求三次方程根
二分法的基本思路是:任意兩個點x1和x2,判斷區間(x1,x2)內有無一個實根,如果f(x1)與f(x2)符號相反,則說明有一實根。接著取(x1,x2)的中點x,檢查f(x)和f(x2)是否同號,如果不同號,說明實根在(x,x2)之間,如果同號,在比較(x1,x),這樣就將范圍縮小一半,然後按上述方法不斷的遞歸調用,直到區間相當小(找出根為止)!
比如用二分法求f(x)=x^3-6x-1=0的實根。
代碼如下(已調試):
#include
"math.h"
main()
{
float
x,x1,x2;
float
F(float
x,float
x1,float
x2);
printf("請輸入區間[x1,x2]\n");
scanf("%f%f",&x1,&x2);
printf("x=%f\n",F(x,x1,x2));
}
float
F(float
x,float
x1,float
x2)
{
float
f,f1,f2;
do
{
f1=pow(x1,3)-6*x1-1.0;
f2=pow(x2,3)-6*x2-1.0;
}while(f1*f2>0);
//確保輸入的x1,x2使得f1,f2符號相反
do
{
x=(x1+x2)/2;
//求x1,x2的中點
f=pow(x,3)-6*x-1.0;
if(f1*f>0)
//當f與f1符號相同時
{x1=x;f1=f;}
else
if(f2*f>0)
//當f與f2符號相同時
{x2=x;f2=f;}
}while(fabs(f)>1e-6);
//判斷條件fabs(f)>1e-6的意思是f的值非常0
return
x;
}
輸入:1
5
則輸出:x=2.528918
輸入:-10
10
則輸出:x=2.528918
㈥ C語言編程中什麼是二分法
先把數據排序,然後把目標數值與中間的數值相比較,根據中間數值是大於、小於、等於三種情況變化數列的首尾指針,構成新數列,再取新數列的中間數與目標值比較,如此反復。。。
㈦ C語言:二分法
這段代碼是求解方程f(x)=0在區間[-10,10]上的根的數值解。
方法的思想就是:一直選取區間中間的數值,如果發現中間的函數值與一側函數值,異號,那麼說明解在這個更小的區間中,採用eps=1e-5作為區間的極限大小,通過迭代的方法求解這個方程的數值解。
所以了解了上述思想,那麼else if(f(a)*f(c)<0) b=c; 說明的是 f(a)和f(c)異號,那麼使用b=(a+b)/2縮小迭代區間,繼續迭代;同理else a=c;說明f(a)和f(c)同號,那麼使用a(a+b)/2縮小迭代區間,繼續迭代!