一些算法总结

Posted ch459742906

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些算法总结相关的知识,希望对你有一定的参考价值。


//约瑟夫环,使用数组模拟环形,每数过去一个,就放在数组末尾
$arr=[1,2,3,4,5,6,7,8,9];
$every=5;//每every次,就踢出一个
function kick($arr,$every){
    while(true){//一直进行,直到满足停止的条件
        for($i=0;$i<$every-1;$i++){//不需要踢出的次数为$every-1
            if(count($arr)>=1){//必须至少有一个,保证可以按规则进行
                //从数组头部踢出挪到尾部
                $beshifted=array_shift($arr);
                array_push($arr, $beshifted);
            }
        }
        if(count($arr)>1){//大于一个,需要踢出
            array_shift($arr);    
        }else{
            return $arr;//只有一个,则停止
        }
    
    }
}

 

<?php
/*
另一种思路

*/
$arr=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26];
function kick($arr,$killedNum){
    while(count($arr)){//只要还有元素,则继续玩
        for($i=0;$i<$killedNum-1;$i++){
            $shifted=array_shift($arr);//首部踢出
            $arr[]=$shifted;//放末尾
        }
        if(count($arr)>1){//不少于一个,则踢出去
            array_shift($arr);
        }else{
            return $arr;//只有一个了,就是最终了
        }
    }
}
print_r(kick($arr,5));

 

<?php
/*
冒泡排序
思路:
大循环,需要总个数-1次
小循环,第一次需要检查总个数-1次,以后逐渐减1
*/
$arr=[44,64,634,745,2,6546,1,3334,54];
function bubble($arr){
    $compareTime=count($arr)-1;//总共比较多少次
    $changeTime=count($arr)-1;//每次比较交换多少次
    for($i=0;$i<$compareTime;$i++){
        for($j=0;$j<$changeTime;$j++){
            if($arr[$j]>$arr[$j+1]){
                $tmp=$arr[$j+1];
                $arr[$j+1]=$arr[$j];
                $arr[$j]=$tmp;
            }
        }
        $changeTime--;
    }
    return $arr;
}
print_r(bubble($arr));

 

 

<?php
//二维数组排序
$person=array(
        array(‘id‘=>2,‘name‘=>‘c‘,‘age‘=>23),
        array(‘id‘=>5,‘name‘=>‘b‘,‘age‘=>28),
        array(‘id‘=>3,‘name‘=>‘apple‘,‘age‘=>17)
    );

function array_sort($person,$keyValue=‘name‘){
    $tmpArr=[];//存储大key与小key对应值的映射
    $finArr=[];//排好序的二维数组
    foreach ($person as $key => $subarr) {
        $tmpArr[$key]=$subarr[$keyValue];
    }
    asort($tmpArr);//asort排序,并且不去改变索引关系

    foreach ($tmpArr as $key => $value) {
        $finArr[]=$person[$key];
    }
    return $finArr;
}
    $result = array_sort($person,‘age‘,1);
print_r($result);

 

<?php
/*
一种快速排序的实现
随便取一个值,把比这个值小的放一起,比这个值大的放一起
再对这两小撮值递归同上处理
直到放在一起的值不能再往下处理(没有或者只有一个)
*/
$arr=[44,664,3423,5646,112,54555,1,33,3,534534535,1];

function quicksort($arr){
    $relativeKey=floor(count($arr)/2);//取出一个key,可以中间,也可以随机
    $relativeNum=$arr[$relativeKey];//这个key对应的value
    unset($arr[$relativeKey]);//这个value不要参与处理
    $left=[];//比value小的值
    $right=[];//比value大的值
    $sortedLeft=[];//比value小,已排好序的
    $sortedRight=[];//比value大,已排好序的
    foreach ($arr as $key => $value) {
        if($value<=$relativeNum){
            $left[]=$value;//小的
        }else{
            $right[]=$value;//大的
        }
    }
    if(count($left)<=1){//如果左侧是空数组或者只有一个,则处理结束
        $sortedLeft=$left;
    }else{
        $sortedLeft=quicksort($left);//递归处理
    }
    if(count($right)<=1){//右侧同理左侧
        $sortedRight=$right;
    }else{
        $sortedRight=quicksort($right);
    }
    return array_merge($sortedLeft,[$relativeNum],$sortedRight);//排好序的左侧,中间,右侧一同返回


}
print_r(quicksort($arr));

 

以上是关于一些算法总结的主要内容,如果未能解决你的问题,请参考以下文章

以下代码片段的算法复杂度

python常用代码片段总结

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

片段(Java) | 机试题+算法思路+考点+代码解析 2023

BootStrap有用代码片段(持续总结)

是否有在单个活动中处理多个片段的 Android 设计模式?