2:用二分法在一个数组中查找你所需元素

 

  1. <?php  
  2. /*  
  3. *2:用二分法在一个数组中查找你所需元素  
  4. *系统环境:windows/linux  
  5. *编译环境:php4/php5  
  6. *输入参数:存放在in.txt,多个参数时空格分隔  
  7.                     参数1是一组数字或者字符串,中间用分号分割,按照字符串升序或者降序排列  
  8.                     参数2是一个元素   
  9.                     例如格式:1,33,ad,bb,cs,ds  ds   
  10.                               1,12,23,64,75  23  
  11.     输出:out.txt  
  12. */ 
  13.  
  14. $params=getParams(2);  
  15. $argv0=trim($params[0]);  
  16. $argv1=trim($params[1]);  
  17.  
  18. //排序默认为升序,-1表示未知,true表示升序,false 表降序  
  19. $isOrderAsc=-1;  
  20.  
  21. //把参数1转为数组  
  22. $items=split(",",$argv0);  
  23. $tmp_items=$items;  
  24. //判断是不是升序  
  25. if(sort($tmp_items,SORT_STRING)&& $tmp_items===$items)  
  26. {  
  27.     $isOrderAsc=true;  
  28. }else if(rsort($tmp_items,SORT_STRING) && $tmp_items===$items)  
  29. {  
  30.     //判断是不是降序  
  31.     $isOrderAsc=false;  
  32. }  
  33. if($isOrderAsc===-1)  
  34. {  
  35.     error_msg("params 1 must order by asc or desc");  
  36. }  
  37. //按照二分法查找索引  
  38. $item_index=bsearch($items,$argv1,$isOrderAsc);  
  39. //输出结果  
  40. output("'$argv1' index is:".$item_index,true);  
  41. error_msg("execute success");  
  42. /*  
  43.     二分法查找元素  
  44.     $aArray,查找的数组,已经按照升序或者降序排列  
  45.     $aItem,查找的元素  
  46.     $isOrderAsc,true表示升序,false表示降序  
  47. */ 
  48. function bsearch($aArray,$aItem,$isOrderAsc)  
  49. {  
  50.     $low=0;  
  51.     $high=count($aArray);  
  52.     //比较指针  
  53.     $middle=-1;  
  54.     while($low < $high)  
  55.     {  
  56.         $middle=floor(($high+$low)/2);  
  57.         //当下半段比aItem大  
  58.         if($aArray[$middle] > $aItem)  
  59.         {  
  60.             if($isOrderAsc)  
  61.             {  
  62.                 //升序时  
  63.                 $high=$middle-1;  
  64.             }else{  
  65.                 //降序时  
  66.                 $low=$middle+1;  
  67.             }  
  68.         }else   
  69.         {  
  70.             if($aArray[$middle] < $aItem)  
  71.             {  
  72.                 if($isOrderAsc)  
  73.                 {  
  74.                     //升序时  
  75.                     $low=$middle+1;  
  76.                 }else{  
  77.                     //降序时  
  78.                     $high=$middle-1;  
  79.                 }  
  80.             }else 
  81.             {  
  82.                 //相等时返回  
  83.                 return $middle;   
  84.             }  
  85.         }  
  86.     }  
  87.     //没有找到时返回-1  
  88.     return -1;  
  89. }  
  90. /*  
  91.     从in.txt里读取参数  
  92.       
  93. */ 
  94. function getParams($paramNum)  
  95. {  
  96.     $in=file_get_contents("in.txt");  
  97.     if($in===FALSE){  
  98.         error_msg("cannot read in.txt,please check in.txt exists\n");     
  99.     }  
  100.     $in=preg_replace("/(\s+)/i"" "$in);  
  101.     //多个参数时,按照空格分隔  
  102.     $parms=split(" ",trim($in));  
  103.     if($parms===FALSE)  
  104.     {  
  105.         error_msg("cannot get param from in.txt\n");  
  106.     }  
  107.     if(count($parms) < $paramNum)  
  108.     {  
  109.         error_msg("it needs $paramNum params\n");  
  110.     }  
  111.     return $parms;  
  112. }  
  113.  
  114. /*  
  115.     把结果输出到输出文件里  
  116.     当isClean=true时清空out.txt  
  117. */ 
  118. function output($msg,$isClean=false)  
  119. {  
  120.     if($isClean)  
  121.     {  
  122.     $handle = fopen('out.txt''w');  
  123.     fclose($handle);      
  124.     }  
  125.     error_log($msg."\n", 3, "out.txt");  
  126. }  
  127. /*  
  128.     输入错误信息  
  129.     如果$is_exit表示输入信息后退出  
  130. */ 
  131. function error_msg($msg,$is_exit=true)  
  132. {  
  133.     if($is_exit)  
  134.         die($msg."\n");  
  135.     else 
  136.         echo $msg."\n";  
  137. }  
  138. ?>