冒泡排序
<?php //冒泡排序 echo '<pre>'; $arr = array(2,3,0,4,1,6,5); //因为排序需要每次将一个元素与数组的其他元素进行比较,所以需要两层循环来控制 //外层循环控制冒泡次数 //内存循环比较每次的大小,得到每次的最大值(泡) for($i = 0,$length = count($arr);$i < $length-1;$i++){ //内存循环 for($j = 0;$j < ($length - $i - 1);$j++){ //拿着j变量所对应的数组元素,与后面的元素进行比较 if($arr[$j] > $arr[$j + 1]){ //交换位置 $temp = $arr[$j]; $arr[$j] = $arr[$j+1]; $arr[$j+1] = $temp; } } } var_dump($arr);
<?php //递归做二分查找 function binarySearch($arr,$findVal,$leftIndex,$rightIndex){ //当 $rightIndex>$leftIndex 说明没有数 //为什么 if($rightIndex<$leftIndex){ echo "找不到该数"; return ; } //找到中间这个数 $middleIndex=round(($rightIndex+$leftIndex)/2); //如果大于则,向后面找 if($findVal>$arr[$middleIndex]){ echo '大 middleIndex是'.$middleIndex.' rightIndex是'.$rightIndex.' middleIndex加1,和rightIndex求平均<br/>'; binarySearch($arr,$findVal,$middleIndex+1,$rightIndex); }else if($findVal<$arr[$middleIndex]){ //如果是小于中间这个数,则向前面找 echo '小 leftIndex是'.$leftIndex.' middleIndex是'.$middleIndex.' middleIndex减1,和leftIndex求平均<br/>'; binarySearch($arr,$findVal,$leftIndex,$middleIndex-1); }else{ echo '等 leftIndex是'.$leftIndex.' middleIndex是'.$middleIndex.' rightIndex是'.$rightIndex.'<br/>'; echo "找到这个数它在数组中的下标是 $middleIndex"; } } $arr = range(1,100); print_r($arr); echo '<br/>'; binarySearch($arr,97.5,0,count($arr)-1);//最后一个参数必须是右索引的最大值,这里是99
while循环做二分查找
<?php #二分查找 function binarySearch(Array $arr, $target) { $low = 0; $high = count($arr) - 1; while($low <= $high) { $mid = floor(($low + $high) / 2); #找到元素 if($arr[$mid] == $target) return $mid; #中元素比目标大,查找左部 if($arr[$mid] > $target) $high = $mid - 1; #重元素比目标小,查找右部 if($arr[$mid] < $target) $low = $mid + 1; } #查找失败 return false; } $arr = range(1,100); $inx = binarySearch($arr, 0); var_dump($inx); ?>
<?php //遍历所有文件及子文件夹 //1. 引入header文件 include '../20140816/header.php'; echo '<pre>'; //2. 给定路径(绝对路径) $dir = 'D:/server/apache/htdocs/20140817'; //$dir = 'D:/server/apache/htdocs'; //3. 获取资源 if(is_dir($dir)){ $o = opendir($dir); //记住当前目录 $temp = $dir; //记住第一层level $level = 0; //保存所有遍历到的文件 $readfile[$temp] = array(); //永远执行循环,直到循环内部把当前所有的文件及子文件夹遍历完break退出 while(1){ //从当前目录资源中读出文件(目录资源会变化) $filename = readdir($o); //如果为真,表示还能读到当前目录下的文件,否则是false,表示读到当前目录的最末尾 if($filename){ //判断当前文件是否已经被读到过:如果已经在数组里,那么就跳过当前文件,表示已经读过了 if(!in_array($filename,$readfile[$temp])){ //如果文件是不在数组里,那么就需要添加进数组 //数组用二维,记录每个路径下的对应的文件 $readfile[$temp][] = $filename; //判断文件是否是.和.. if($filename == '.' || $filename == '..'){ echo str_repeat(" ",$level) . "<font color='red'>$filename</font><br/>"; continue; } //将当前读到的文件与前面的路径连接起来,用于文件判断 $temp .= '/' . $filename; //因为文件路径增加一层,那么对应的层数要增加 $level++; //如果是路径表示要进入路径,读取子目录下的文件 if(is_dir($temp)){ //如果子目录对应在数组里还不存在,那么需要事先为子目录定义一个数组(二维) if(!isset($readfile[$temp]))$readfile[$temp] = array(); //输出信息 echo str_repeat(" ",($level - 1)) . "<font color='red'>$filename</font><br/>"; //改变当前工作目录 chdir($temp); //重新打开子目录资源进行读取 $o = opendir($temp); continue; }else{ //当前是文件信息,那么表示不需要进入目录,那么对应的层数也不需要增加 $level--; $temp = substr($temp,0,strrpos($temp,'/')); echo str_repeat(" ",$level) . "<font color='blue'>$filename</font><br/>"; continue; } } }else{ //当前文件夹已经被遍历完,readdir读到false //如果当前目录已经是指定的目录了,那么表示整个文件夹遍历完毕,跳出循环 if($temp == $dir) break; else{ //当前目录是子目录,那么需要回到上级目录进行继续遍历 $temp = substr($temp,0,strrpos($temp,'/')); //回到上级目录,并重新获取上级目录资源 chdir($temp); $o = opendir($temp); //当前子目录读完,需要将层数往回走 $level--; } } } } print_r($readfile);
递归遍历目录与子目录文件
<?php //递归实现目录遍历:遍历当前目录及其所有子目录里面的内容 //指定路径 $dir = 'D:/server/apache/htdocs/20140817'; /* * 递归遍历文件夹 * @param1 string $dir,要遍历的目录 * @param2 int $level,当前目录的层次,默认为0层(专门用于输出当前目录里的文件的前面的空格) */ function myScanDir($dir,$level = 0){ //判断是否是一个路径 if(!is_dir($dir)) return false; //是一个路径 //获取路径资源 $o = opendir($dir); //循环获取文件夹里面的内容 while($filename = readdir($o)){ //判断.和..目录 if($filename == '.' || $filename == '..'){ echo str_repeat(" ",$level * 2) . "<font color='red'>{$filename}</font><br/>"; //不再往下执行,重新获取数据 continue; } //判断当前读到的内容是一个目录还是一个文件 if(is_dir($dir . '/' . $filename)){ //输出内容 echo str_repeat(" ",$level * 2) . "<font color='red'>{$filename}</font><br/>"; //当前获取到的文件是一个目录 //递归点 myScanDir($dir . '/' . $filename,$level + 1); }else{ //是一个文件名 echo str_repeat(" ",$level * 2) . "<font color='blue'>{$filename}</font><br/>"; } } //如果结束,return return; } //调用 myScanDir($dir);