用二分法在一个数组中查找你所需元素
2011-07-20 22:57
459 查看
2:用二分法在一个数组中查找你所需元素
本文出自 “一方有” 博客,请务必保留此出处http://yifangyou.blog.51cto.com/900206/618823
<?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"; } ?>
本文出自 “一方有” 博客,请务必保留此出处http://yifangyou.blog.51cto.com/900206/618823
相关文章推荐
- 设计一个模板类Sample,用于对一个有序数组采用二分法查找元素下标
- C#版本,二分法查找元素是否在一个目标数组中?
- 查找一个有序数组中的一个元素——二分法
- 如何使用Linq查找数组中一个元素所在的位置
- 查找一个数组中超过一半的元素
- 利用二分查找在循环递增数组中检索一个元素
- Java实现二分法查找数组中的元素
- 查找数组中被删除的一个元素
- 查找一个list中各个数组的元素在一个固定数组中的位置, 并把位置信息记录到一个矩阵里
- 输入一个数组,用二分法查找Java实现
- 解析php二分法查找数组是否包含某一元素
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
- 二分法查找有序数组中某元素个数
- 用php二分法查找一个值在数组中的位置
- 定义一个一维数组,其元素个数从键盘中输入,元素的值为[100,200]的随机整数。 (1)输出数组的每个数 (2)对数组的数进行升序排序,输出排序后的数组元素 (3)从键盘上输入一个整数,查找该整数是
- 二分法在有序数组中查找一个数
- 设计一个更优算法查找一n个元素数组中的最大值和最小值
- 使用二分法查找数组中的元素
- 设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。
- 在一个数组中查找最大的K个元素或者最小的K个元素