您的位置:首页 > 其它

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

2011-07-20 22:57 459 查看
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";
}
?>


本文出自 “一方有” 博客,请务必保留此出处http://yifangyou.blog.51cto.com/900206/618823
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐