冒泡排序 二分排序 while遍历、递归遍历目录与子目录文件

时间:2022-01-18 13:38:57

冒泡排序

<?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);