用二分法在一个数组中查找你所需元素
2011-07-20 22:57
141 查看
2:用二分法在一个数组中查找你所需元素
- <?php
- /*
- *2:用二分法在一个数组中查找你所需元素
- *系统环境:windows/linux
- *编译环境:php4/php5
- *输入参数:存放在in.txt,多个参数时空格分隔
- 参数1是一组数字或者字符串,中间用分号分割,按照字符串升序或者降序排列
- 参数2是一个元素
- 例如格式:1,33,ad,bb,cs,ds ds
- 1,12,23,64,75 23
- 输出:out.txt
- */
- $params=getParams(2);
- $argv0=trim($params[0]);
- $argv1=trim($params[1]);
- //排序默认为升序,-1表示未知,true表示升序,false 表降序
- $isOrderAsc=-1;
- //把参数1转为数组
- $items=split(",",$argv0);
- $tmp_items=$items;
- //判断是不是升序
- if(sort($tmp_items,SORT_STRING)&& $tmp_items===$items)
- {
- $isOrderAsc=true;
- }else if(rsort($tmp_items,SORT_STRING) && $tmp_items===$items)
- {
- //判断是不是降序
- $isOrderAsc=false;
- }
- if($isOrderAsc===-1)
- {
- error_msg("params 1 must order by asc or desc");
- }
- //按照二分法查找索引
- $item_index=bsearch($items,$argv1,$isOrderAsc);
- //输出结果
- output("'$argv1' index is:".$item_index,true);
- error_msg("execute success");
- /*
- 二分法查找元素
- $aArray,查找的数组,已经按照升序或者降序排列
- $aItem,查找的元素
- $isOrderAsc,true表示升序,false表示降序
- */
- function bsearch($aArray,$aItem,$isOrderAsc)
- {
- $low=0;
- $high=count($aArray);
- //比较指针
- $middle=-1;
- while($low < $high)
- {
- $middle=floor(($high+$low)/2);
- //当下半段比aItem大
- if($aArray[$middle] > $aItem)
- {
- if($isOrderAsc)
- {
- //升序时
- $high=$middle-1;
- }else{
- //降序时
- $low=$middle+1;
- }
- }else
- {
- if($aArray[$middle] < $aItem)
- {
- if($isOrderAsc)
- {
- //升序时
- $low=$middle+1;
- }else{
- //降序时
- $high=$middle-1;
- }
- }else
- {
- //相等时返回
- return $middle;
- }
- }
- }
- //没有找到时返回-1
- return -1;
- }
- /*
- 从in.txt里读取参数
- */
- function getParams($paramNum)
- {
- $in=file_get_contents("in.txt");
- if($in===FALSE){
- error_msg("cannot read in.txt,please check in.txt exists\n");
- }
- $in=preg_replace("/(\s+)/i", " ", $in);
- //多个参数时,按照空格分隔
- $parms=split(" ",trim($in));
- if($parms===FALSE)
- {
- error_msg("cannot get param from in.txt\n");
- }
- if(count($parms) < $paramNum)
- {
- error_msg("it needs $paramNum params\n");
- }
- return $parms;
- }
- /*
- 把结果输出到输出文件里
- 当isClean=true时清空out.txt
- */
- function output($msg,$isClean=false)
- {
- if($isClean)
- {
- $handle = fopen('out.txt', 'w');
- fclose($handle);
- }
- error_log($msg."\n", 3, "out.txt");
- }
- /*
- 输入错误信息
- 如果$is_exit表示输入信息后退出
- */
- function error_msg($msg,$is_exit=true)
- {
- if($is_exit)
- die($msg."\n");
- else
- echo $msg."\n";
- }
- ?>
阅读更多
相关文章推荐
- 用二分法在一个数组中查找你所需元素
- 设计一个模板类Sample,用于对一个有序数组采用二分法查找元素下标
- C#版本,二分法查找元素是否在一个目标数组中?
- 查找一个有序数组中的一个元素——二分法
- 在一个有序数组中查找具体的某个数字——二分法——函数法
- 利用二分查找在循环递增数组中检索一个元素
- 给定一个经过一次旋转的有序数组,从中查找一个值,若存在返回它的索引,不存在返回-1,假定数组存在重复元素
- 如何使用Linq查找数组中一个元素所在的位置
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- 对于一个有序的数组,如果要插入一个元素并保证数组还有序, 问如何获取该元素位置。用二分法
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
- 查找无序数组中的一个元素下标,并分析时间和空间复杂度, 考虑效率(很重要)
- 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素
- 二分法实现一个整形有序数组的二分查找
- merge两个有序数组 & 查找一个有序数组中指定元素
- 使用二分法查找数组中的元素
- 查找一个数组中超过一半的元素
- 完成一个排序,求最大最小值,和查找数组元素的程序
- 设计一个更优算法查找一n个元素数组中的最大值和最小值