//木桶排序
/* 首先产生两个数字,最大值和最小值,然后根据两个数字的值决定要创建多少个桶装数据,
每个 桶装数据按key编好号码,按数组内的数字指定桶的出现次数。
然后输出所有指定桶。木桶算法是不稳定算法。
*/
$count = array(6,10,4,12,4,90,33);
function mutong($max,$array)
{
//填充木桶
$arr = array_fill(0, $max, 0);//函数用给定的键值填充数组
//开始标示木桶
for($i = 0; $i<=count($array)-1 ; $i++){
//var_dump($array[$i]);
isset($arr[$array[$i]])? $arr[$array[$i]]++ : "";
}
$mutomg = array();
//开始从木桶中拿出数据
for($i = 0; $i<= $max ; $i++){
$arr[$i] = isset($arr[$i]) ? $arr[$i] : "";
for($j = 1; $j <= $arr[$i]; $j++){ //这一行主要用来控制输出多个数字
$mutong[] = $i;
}
}
return $mutong;
}
$max = max($count);//90
print_r(mutong($max,$count));
//冒泡算法
对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换。这样比较小(大)的数值就将逐渐从后面向前面移动。
$arr=array(1,43,54,62,21,66,32,78,36,76,39);
function getpao($arr)
{
$len=count($arr);
//设置一个空数组 用来接收冒出来的泡
//该层循环控制 需要冒泡的轮数
for($i=1;$i<$len;$i++){ //该层循环用来控制每轮 冒出一个数 需要比较的次数
for($k=0;$k<$len-$i;$k++){
if($arr[$k]>$arr[$k+1]){
$tmp=$arr[$k+1];
$arr[$k+1]=$arr[$k];
$arr[$k]=$tmp;
}
}
}
return $arr;
}
var_dump(getpao($arr));
快速排序
基本思想:
在数组中挑出一个元素(多为第一个)作为标尺,扫描一遍数组将比标尺小的元素排在标尺之前,将所有比标尺大的元素排在标尺之后,通过递归将各子序列分别划分为更小的序列直到所有的序列顺序一致。
//快速排序
<?php
//快速排序
function quick_sort($arr)
{
//先判断是否需要继续进行
$length = count($arr);
if($length <= 1)
{
return $arr;
}
$base_num = $arr[0];//选择一个标尺 选择第一个元素
//初始化两个数组
$left_array = array();//小于标尺的
$right_array = array();//大于标尺的
for($i=1; $i<$length; $i++)
{ //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
if($base_num > $arr[$i])
{
//放入左边数组
$left_array[] = $arr[$i];
}
else
{
//放入右边
$right_array[] = $arr[$i];
}
}
//再分别对 左边 和 右边的数组进行相同的排序处理方式
//递归调用这个函数,并记录结果
$left_array = quick_sort($left_array);
$right_array = quick_sort($right_array);
//合并左边 标尺 右边
return array_merge($left_array, array($base_num), $right_array);
}
$arr = array(3,1,2);
var_dump(quick_sort($arr));
?>
三、二分查找
基本思想:
假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。(数据量大的时候使用)
//二分查找
<?php
//二分查找
function bin_search($arr,$low,$high,$k)
{
if($low <= $high)
{
$mid = intval(($low + $high)/2);
if($arr[$mid] == $k)
{
return $mid;
}
else if($k < $arr[$mid])
{
return bin_search($arr,$low,$mid-1,$k);
}
else
{
return bin_search($arr,$mid+1,$high,$k);
}
}
return -1;
}
$arr = array(1,2,3,4,5,6,7,8,9,10);
print(bin_search($arr,0,9,3));
?>
四、顺序查找
基本思想:
从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
//顺序查找
<?php
//顺序查找
function seq_search($arr,$n,$k)
{
$array[$n] = $k;
for($i = 0;$i < $n; $i++)
{
if($arr[$i] == $k)
{
break;
}
}
if($i < $n)
{
return $i;
}
else
{
return -1;
}
}
?>
五、写一个函数,能够遍历一个文件下的所有文件和子文件夹
<?php
function my_scandir($dir)
{
$files = array();
if($handle = opendir($dir))
{
while (($file = readdir($handle))!== false)
{
if($file != '..' && $file != '.')
{
if(is_dir($dir."/".$file))
{
$files[$file]=my_scandir($dir."/".$file);
}
else
{
$files[] = $file;
}
}
}
closedir($handle);
return $files;
}
}
var_dump(my_scandir('../'));
?>
六、写一个函数,尽可能高效的从一个标准url中取出文件的扩展名?
<?php
function getExt($url)
{
$arr = parse_url($url);//parse_url解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分
//'scheme' => string 'http' (length=4)
//'host' => string 'www.sina.com.cn' (length=15)
//'path' => string '/abc/de/fg.php' (length=14)
//'query' => string 'id=1' (length=4)
$file = basename($arr['path']);// basename函数返回路径中的文件名部分
$ext = explode('.', $file);
return $ext[count($ext)-1];
}
print(getExt('http://www.sina.com.cn/abc/de/fg.html.php?id=1'));
?>