PHP常用算法

排序算法

/**
 * 冒泡排序(效率低)
 * 外层循环决定循环层数
 * 内层循环两两比较
 */
$array = array(3, 4, 23, 2, 56, 33);
function bubble_sort($arr)
{
    $len = count($arr); // 计算长度
    for ($i = 1; $i < $len; $i++) {
	    for ($j = 0; $j < $len-$i; $j++) {
	        if ($arr[$j+1] < $arr[$j]) {
	            list($arr[$j+1], $arr[$j]) = [$arr[$j], $arr[$j+1]];
	         }
	     }
	 }
 }  
    return $arr;
}
/**
 * 选择排序
 */
$array  = array(12, 3, 5, 123, 45, 6);
function select_sort($arr)
{
    $len = count($arr);
    for ($i = 0;  $i < $len-1;  ++$i) {
        $temp = $i; // 假设$i就是当前最小值的位置 参与比较的的元素
        for ($j = $i+1; $j < $len; ++$j){ // 用$i来循环比较,然后记录下最小值的位置
            if ($arr[$temp] > $arr[$j]) {
                    $temp = $j;
            }
        }
        if ($temp != $i) { // 如果记录下的最小值不等于$i,则他们的位置互换
            $re = $arr[$temp];
            $arr[$temp] = $arr[$i];
            $arr[$i] = $re;
        }
    }
    return $arr;
}
select_sort($array);
/**
 * 快速排序
 * 运用递归思想
 */
$array = array(8, 4, 23, 2, 56, 35);
function quick_sort($arr)
{
    $len = count($arr);
    if ($len <= 1) { // 递归出口 数组 长度小于等于1直接返回数组
        return $arr;
    }
    $breakpoint = $arr[0]; // 选择数组中的随意一个元素(一般为数组的第一个元素)为断点 新建两个数组 遍历整个数组
    $left_array = array();
    $right_array = array();
    for ($i = 1; $i < $len; ++$i) {
        if ($breakpoint < $arr[$i]) { // 比断点小的放左边数组 反之 放右边的数组
            $left_array[] = $arr[$i];
        } else {
            $right_array[] = $arr[$i];
        }
    }
    // 递归调用
    $left = quick_sort($left_array);
    $right = quick_sort($right_array);
    return array_merge($left,array($breakpoint), $right);

}
quick_sort($array);

随机取一算法

/**
 * 随机取一算法 经典案例 
 * 一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,
 * 从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。
 * 要求编程模拟此过程,输入n,m,输出最后那个大王的编号。
 * @param int $n 猴子总数
 * @param int $m
 * @return int mixed 猴王
 */
function random($n, $m)
{
    $monkey = range(1, $n);
    $i = 0;
    while (count($monkey) > 1) {
        if ((($i+1)%$m) == 0) {
            unset($monkey[$i]);
        }else{
            array_push($monkey, $monkey[$i]);
            unset($monkey[$i]);
        }
        $i++;
    }
    return current($monkey);
}
echo random(10, 3);

递归

/**
 * 静态变量实现递归
 */
function rec()
{
    static $i = 0;
    echo $i;
    $i++;
    if ($i < 10) {
        rec();
    }
}
rec();
/**
 * 全局变量实现递归
 */
static $i=0;
function recs()
{
    global $i;
    echo $i;
    $i++;
    if ($i < 10) {
        rec();
    }
}
rec();
/**
 * 引用参数实现递归
 * @param int $a
 * @param array $res
 * @return array
 */
function test($a=0, &$res=array())
{
    $a++;  // 1-9
    if ($a < 10) {
        $res[] = $a;
        test($a, $res);
    }
    echo $a; // 10-1
    return $res; // 1-9
}
var_dump(test());
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值