二分查找及其變種

上次寫個二分查找,錯誤百出,唉,還真如編程珠璣裏面說的,寫二分查找的人 90%都不會一次成功。深深的鄙視一下自己,貼一下二分的代碼,以及二分查找的變種代碼

 

  1. //二分查找 
  2. function binary _search($search$data_arr$lower$upper
  3.     if($lower > $upper
  4.     { 
  5.         return false; 
  6.     } 
  7.      
  8.     $mid = intval( ($lower + $upper) / 2 ); 
  9.      
  10.     if($search == $data_arr[$mid]) 
  11.     { 
  12.         return $mid
  13.     }elseif($search < $data_arr[$mid]) 
  14.     { 
  15.         $upper = $mid - 1; 
  16.     }else 
  17.     { 
  18.         $lower = $mid + 1; 
  19.     } 
  20.      
  21.     return search($search$data_arr$lower$upper); 
  22.  
  23. /* 
  24.  * 二分查找變種,查找$search第一次出現的位置 ,對於傳值,$lower=-1  $upper=count($data_arr)
  25.  *  
  26.  * array(0,2,3,7,8,8,8,9,10) 
  27.  * binary_search_begin(8, ....) 
  28.  * 返回值4 
  29.  */ 
  30. function binary_search_begin($search$data_arr$lower$upper
  31.     if( ($lower + 1) == $upper ) 
  32.     { 
  33.         return ($data_arr[$upper] == $search)? $upper : -1; 
  34.     } 
  35.      
  36.     $mid = intval( ($lower + $upper) / 2 ); 
  37.      
  38.     if$data_arr[$mid] < $search ) 
  39.     { 
  40.         $lower = $mid
  41.     }else  
  42.     { 
  43.         $upper = $mid
  44.     } 
  45.      
  46.     return binary_search_begin($search$data_arr$lower$upper); 
  47.  
  48. /* 
  49.  * 二分查找變種,查找$search最後一次出現的位置 ,對於傳值,$lower=-1  $upper=count($data_arr)
  50.  * array(0,2,3,7,8,8,8,9,10) 
  51.  * binary_search_begin(8, ....) 
  52.  * 返回值6 
  53.  */ 
  54. function binary_search_end($search$data_arr$lower$upper
  55.     if( ($lower + 1) == $upper ) 
  56.     { 
  57.         return ($data_arr[$lower] == $search)? $lower : -1; 
  58.     } 
  59.      
  60.     $mid = intval( ($lower + $upper) / 2 ); 
  61.      
  62.     if$data_arr[$mid] > $search ) 
  63.     { 
  64.         $upper = $mid
  65.     }else  
  66.     { 
  67.         $lower = $mid
  68.     } 
  69.      
  70.     return binary_search_end($search$data_arr$lower$upper); 

 

其迭代方法的實現爲:

 

  1. //二分查找 
  2. function binary_search($search$data_arr$lower$upper
  3.     while($lower <= $upper
  4.     { 
  5.         $mid = intval( ($lower + $upper) / 2 ); 
  6.          
  7.         if($data_arr[$mid] > $search
  8.         { 
  9.             $upper = $mid - 1; 
  10.         }elseif($data_arr[$mid] < $search
  11.         { 
  12.             $lower = $mid + 1; 
  13.         }else  
  14.         { 
  15.             return $mid
  16.         } 
  17.     } 
  18.      
  19.     return false; 
  20.  
  21. /* 
  22.  * 二分查找變種,查找$search第一次出現的位置,對於傳值,$lower=-1  $upper=count($data_arr) 
  23.  * array(0,2,3,7,8,8,8,9,10) 
  24.  * binary_search_begin(8, ....) 
  25.  * 返回值4 
  26.  */ 
  27. function binary_search_begin($search$data_arr$lower$upper
  28.     while($lower + 1 != $upper
  29.     { 
  30.         $mid = intval( ($lower + $upper) / 2 ); 
  31.          
  32.         if($data_arr[$mid] < $search
  33.         { 
  34.             $lower = $mid
  35.         }else  
  36.         { 
  37.             $upper = $mid
  38.         } 
  39.          
  40.         $p = $upper
  41.          
  42.         if($data_arr[$p] != $search
  43.         { 
  44.             $p = false; 
  45.         } 
  46.     } 
  47.      
  48.     return $p
  49.  
  50. /* 
  51.  * 二分查找變種,查找$search最後一次出現的位置,對於傳值,$lower=-1  $upper=count($data_arr) 
  52.  * array(0,2,3,7,8,8,8,9,10) 
  53.  * binary_search_begin(8, ....) 
  54.  * 返回值6 
  55.  */ 
  56. function binary_search_end($search$data_arr$lower$upper
  57.     while($lower + 1 != $upper
  58.     { 
  59.         $mid = intval( ($lower + $upper) / 2 ); 
  60.          
  61.         if($data_arr[$mid] > $search
  62.         { 
  63.             $upper = $mid
  64.         }else  
  65.         { 
  66.             $lower = $mid
  67.         } 
  68.          
  69.         $p = $lower
  70.         if($data_arr[$p] != $search
  71.         { 
  72.             $p = false; 
  73.         } 
  74.     } 
  75.      
  76.     return $p
  77.      

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章