2012年5月26日 星期六

C# -> 二分搜尋法

針對一個已經被排序好的數列,
用二分搜尋法半均只要執行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 ;
}






沒有留言:

張貼留言