php常用算法整合,持续更新
管理员 发布于 4年前   473
冒泡排序:
/**
* @param $arr
* 冒泡排序算法的原理如下:
* 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
* 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
* 3.针对所有的元素重复以上的步骤,除了最后一个。
* 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
*/
private function bubbleSort($arr)
{
//获取 长度
$len = count($arr);
//循环比较(相邻的两个元素,比较,交换)
for ($k = 0; $k <= $len; $k++) {
for ($j = $len - 1; $j > $k; $j--) {
//比较
if ($arr[$j] < $arr[$j - 1]) {
//交换
$temp = $arr[$j];
$arr[$j] = $arr[$j - 1];
$arr[$j - 1] = $temp;
}
}
}
return $arr;
}
快速排序
/** @param $arr
* 快速排序算法原理如下:
* 1.通过设置一个初始中间值,来将需要排序的数组分成3部分:小于中间值的左边,中间值,大于中间值的右边
* 2.继续递归用相同的方式来排序左边和右边
* 3.最后合并数组
*/
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));
二分查找算法(折半查找算法)
/**
* @param $x ;@param $a
* 二分查找,需要数组是一个有序数组
* 循环实现
*/
private function binLoop($x, $a)
{
$c = count($a);
$lower = 0;
$high = $c - 1;
while ($lower <= $high) {
//取中间值
$middle = intval(($lower + $high) / 2);//intval() 函数用于获取变量的整数值
//比较(一半一半的比),必须是有序数组
if ($a[$middle] > $x) {
$high = $middle - 1;//在前一半里查
} elseif ($a[$middle] < $x) {
$lower = $middle + 1;//在后一半里查
} else {
return $middle;
}
}
return false;
}
/**
* @param $x ; @param $a ;@param $lower ;@param $high
* 二分查找,需要数组是一个有序数组
* 递归实现
*/
private function binRecursive($x, &$a, $lower = 0, $high = 11)
{
//$lower开始位置 $high结束位置
//采用二分法查找
$c = count($a);
if ($high > $c) {
return false;
}
if ($lower <= $high) {
$middle = intval(($lower + $high) / 2);
if ($a[$middle] == $x) {
return $middle;
} elseif ($a[$middle] < $x) {//在后半段里查
return $this->binSearchRecursive($x, $a, $middle + 1, $high);
} else {//在前半段里查
return $this->binSearchRecursive($x, $a, $lower, $middle - 1);
}
} else {
return false;
}
}
顺序查找
从数组的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
function seqSearch($arr,$toSearch)
{
$nCount = count($arr);
for ($i=0; $i < $nCount; $i++) {
if ($arr[$i] == $toSearch) {
return $i;
}
}
return -1;
}
无限级分类
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
if ($v['pid'] == $pid) {
$v['level'] = $level;
$list[] = $v;
tree($arr,$v['id'],$level+1);
}
}
return $list;
}
遍历一个文件下的所有文件和子文件夹下的文件
function AllFile($dir){
if($dh = opendir($dir)){
while (($file = readdir($dh)) !== false){
if($file !='..' && $file !='.'){
if(is_dir($dir.'/'.$file)){
AllFile($dir.'/'.$file); //如果判断还是文件,则递归
}else{
echo $file; //输出文件名
}
}
}
}
}
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
该博客于2020-12-7日,后端基于go语言的beego框架开发
前端页面使用Bootstrap可视化布局系统自动生成
是我仿的原来我的TP5框架写的博客,比较粗糙,底下是入口
侯体宗的博客
文章标签
友情链接