針對一個已經被排序好的數列,
用二分搜尋法半均只要執行Log2N次,
就可以找到你要的數字。
#include<stdio.h>
#include<stdlib.h>
int to=0 ;
void go(int a[],int st,int ed,int goal) //引數有:一串數字、左界、右界、要找的數字
{
int h=(ed+st)/2 ;
if(ed-st>1)
{
if(a[h]>goal)
{
to+=1 ;
go(a,st,h-1,goal) ; 數字太大,就往小的一方找。
}
else if(a[h]<goal)
{
to+=1 ;
go(a,h+1,ed,goal) ; 數字太小,就往大的一方找。
}
else
{
printf("a[%d] = %d(%d)\t",h,goal,to) ;
}
}
else
{
if(a[st]==goal)printf("a[%d] = %d(%d)\t",st,goal,to) ;
else if(a[ed]==goal) printf("a[%d] = %d(%d)\t",ed,goal,to) ;
else printf("Fail\n") ;
}
}
int main()
{
int a[100],kk=0 ;
for(int k=0;k<100;k++){a[k]=k ;printf("%d \t",a[k]) ;} //在這裡,我們把0~99都找過一次。
printf("\n") ;
for(kk=0;kk<100;kk++)
{
to=1 ;
go(a,0,99,kk) ;
}
system("pause") ;
return 0 ;
}
沒有留言:
張貼留言