php的一些算法收集

目录

/**********************************  打乱次序  **********************************/

/**********************************  冒泡算法  **********************************/

/**********************************  快速排序算法  **********************************/

/**********************************  插入排序  **********************************/

/**********************************  99乘法算法  **********************************/

/**********************************  文件遍历算法  **********************************/

/**********************************  递归算法  **********************************/

/**********************************  素数算法  **********************************/

/**********************************  二分查找  **********************************/


/**********************************  打乱次序  **********************************/

//对索引数组对key进行随机读取重新赋值到新数组

$arr = [0,1,2,3,4,5,6,7,8,9];

function shu_ffle($arr) {

    $num = count($arr);    

    for ($i=0;$i<$num;$i++){

        //随机获取一个key

        $j = rand(0,$num-1);

        list($arr[$i],$arr[$j]) = [ $arr[$j], $arr[$i]];

    }

    return $arr;

}

//print_r( shu_ffle($arr) );

/**********************************  冒泡算法  **********************************/

//第一次循环数组本身 通过第2个变量,对变量进行比较排序

$arr = array('5','2','0','1','3','1','4');

//var_dump( count($arr) );

function BubbleSort(array $arr){

    for ($i=0 ; $i <count($arr) ; $i++) {

        //设置一个空变量

        $data = '';

        //第二次循环数组的部分(count($arr)-1 数组长度-1)

        //设数组长 7位,第一次比较时$i=0 第一位数字5 $arr[$i] 和第二位的数字2 比较 $arr[$j+1]

        for ($j=$i ; $j < count($arr)-1 ; $j++) {

            //相邻的值对比大小,前值大于后值时,对前后值进行互换

            if ($arr[$i] > $arr[$j+1]) {

                $data      = $arr[$i]; //存储前一位原值

                $arr[$i]   = $arr[$j+1];//前值赋后值

                $arr[$j+1] = $data;     //后值赋前值

            }

        }

    }

    return $arr;
}

//print_r(BubbleSort($arr));

/**********************************  快速排序算法  **********************************/

function quickSort( $needSort ){

    //判断是否排序

    $count = count( $needSort);

    if($count <= 1 ) {

        return $needSort;

    }

    //假设数组的中间值是第一位

    $centre = $needSort[0];

    $left = $right = [];

    //第一位被取做中间值时,要在第二位开始循环

    for($i=1; $i<$count; $i++){

        //当前值在小于等于中间值时放入左边数组

        if($needSort[$i] <= $centre){

            $left[] =  $needSort[$i];  

        }else{

            $right[] =  $needSort[$i];  

        }

    }

    //对左右数组再次快速排序

    $left = quickSort( $left );

    $right = quickSort( $right );

    //将左 中 右 进行合并返回排序结果

    return array_merge( $left, array( $centre ), $right);

}

$needSort = [6,-1,0,11,22,3,1,4,6,2,7,9,8,5,3];

//var_dump( quickSort($needSort) );

/**********************************  插入排序  **********************************/

//在一组排好序的数组中插入新元素,并保持好顺序

//核心是冒泡排序的思想,将插入元素对比时进行键值互换

function insertSort( $sortArr , $push){

    $arr = [];$tmp = '';

    for($i=0;$i<count($sortArr);$i++){

        //复制每一个值到新数组

        $arr[$i] = $sortArr[$i];

        //如果小于当前值 插入

        if( $push < $sortArr[$i]){

            $tmp = $sortArr[$i];    //收集当前值

            $arr[$i] = $push;       //当前值改变为插入值

            $arr[$i+1] = $tmp;      //当前值向后移动一位

            $push = $tmp;           //新的插入值等于当前值

        }else{

            if( $i == count($sortArr)-1){ //等于最大轮次数时在尾部插入

                $arr[$i+1] = $push;

            }

        }

    }

    return $arr;

}

$arr = [1,7,9,11,14];

var_dump( insertSort( $arr , 9));

/**********************************  99乘法算法  **********************************/

/*

1*1=1

1*2=2 2*2=1

...

*/

function multiplication($multiplier = 9){

    for($i=1; $i<=$multiplier; $i++ ){

        echo '<br/>';

        for($k=1; $k<=$i; $k++){

            echo "$k × $i = " . $i * $k .'&nbsp;&nbsp;&nbsp;&nbsp;';

        }

        echo '<br/>';

    }

}

//multiplication(9);

/**********************************  文件遍历算法  **********************************/

function filesEach( $dir ){

    //判断文件夹正确

    if( !is_dir($dir) ) return false;

    //获取文件夹内容列表

    $files = array();

    if($handle = opendir($dir)) {

       

        while(($file = readdir($handle)) !== false) {

            if($file != ".." && $file != ".") { //排除根目录;

               

                if(is_dir($dir."/".$file)) { //如果是子文件夹,就进行递归

                    $files[$file] = filesEach($dir."/".$file);

                } else { //不然就将文件的名字存入数组;

                    $files[] = $file;  

                }

            }

        }

        closedir($handle);

    }    

    //返回遍历结果

    return $files;

}

$dir = 'D:\Drivers\Wlan';// 不能打开不在ini open_basedir选项 配置中的目录 也会返回false

$dir = 'D:\WWW\my_work\19复习';

//var_dump(filesEach( $dir ));

/**********************************  递归算法  **********************************/

//递归核心为处理中自己调用自己

function recursion( $num ){

    $num++;

    if( $num < 10  ){

        return recursion( $num );

    }

    return $num;

}

//echo recursion(1);

/**********************************  素数算法  **********************************/

//素数只能被1 和自己整除

function primeNumber( $max ){

    $date = array();

    for ($i = 1; $i<=$max; $i++){

        $cishu = 0;

        //循环被除数的整数项,能被整除时累计一次次数,不等于2次的就不是素数

        for($k=1; $k<=$i; $k++ ){

            if($i % $k == 0){

                $cishu ++;

            }

            if( $cishu > 2 ){

                break;

            }

        }

        if($cishu == 2){

            $date[]=$i;

        }

    }

    return $date;

}

//var_dump( primeNumber( 100 ) );

/**********************************  二分查找  **********************************/

//在有序的数列中通过中位数快速查找目标的方法(对半查找法)

$arr = [-2,-1,0,1,2,3,4,5,6,7,8,9];

function twoSearch( &$array , $search ,$index ,$lastIndex ){

    //根据起始位$index 和结束位 $lastIndex置进行中位数计算 $median向上取整

    $median = intval( ($index + $lastIndex) / 2 );

    //当查询到时返回$median

    if( $array[$median] == $search ){

        return $median;

        //当中位数小于目标时,再次查找数组的后半段,及中位数为起始位

    }elseif( $array[$median] < $search ){

        return twoSearch( $array,$search,$median,$lastIndex  );

        //反过来中位数大于目标时,再次查找数组前半段,及中位数成为结束位

    }elseif( $array[$median] > $search ){

        return twoSearch( $array,$search,$index,$median );

    }

    return false;

}

//当搜索目标不在数列中时,会产生递归循环,加以过滤(不大于最大值,不小于最小值)

//var_dump( '数组key : ' . twoSearch( $arr , 8,0 , count($arr) ) );


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值