php数据结构与算法

php实现双向队列

class Deque{
    private $queue = [];

    public function addFirst($item)
    {
        return array_unshift($this->queue,$item);
    }

    public function addLast($item)
    {
        return array_push($this->queue,$item);
    }

    public function removeFirst()
    {
        return array_shift($this->queue);
    }

    public function removeLast()
    {
        return array_pop($this->queue);
    }
}

冒泡排序

// 冒泡排序
function bubble_sort($arr){
    $len = count($arr);
    if($len <= 1){
        return $arr;
    }
    for ($i = 0;$i < $len;$i++){            // 轮数
        for ($j = 1;$j < $len - $i; $j++){  // 本轮循环对比
            if($arr[$j-1] > $arr[$j]){
                $temp = $arr[$j-1];
                $arr[$j-1] = $arr[$j];
                $arr[$j] = $temp;
            }
        }
    }
    return $arr;
}

$arr = [10,2,36,14,10,25,23,85,99,45];
$arr = bubble_sort($arr);
print_r($arr);

冒泡排序2

function bubble_sort($arr){
    $length = count($arr);
    if ($length <= 1) {
        return $arr;
    }
    for ( $i=0; $i<$length-1; $i++ ) {//轮数
        for ($j=0;$j<$length-1-$i;$j++){//本轮循环对比
            if($arr[$j]>$arr[$j+1]){
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}
echo '<pre>';
print_r(bubble_sort($arr));
echo '</pre>';

快速排序

// 快速排序
function quick_sort($arr){
    $len = count($arr);
    if($len <= 1){
        return $arr;
    }
    $init = $arr[0];
    $left_arr = [];
    $right_arr = [];
    for ($i=1;$i<$len;$i++){
        if($arr[$i] >= $init){
            $right_arr[] = $arr[$i];
        }else{
            $left_arr[] = $arr[$i];
        }
    }
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);
    return array_merge($left_arr,[$init],$right_arr);
}
print_r(quick_sort([111,10,2,36,14,10,25,23,85,99,45]));

约瑟夫环

// 一群猴子排成一圈,按1,2,...,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去...,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。

function king($n,$m){
    $mokey = range(1,$n);
    $i = 0;
    while (count($mokey) > 1){
        $i += 1;
        $head = array_shift($mokey);

        if($i % $m != 0){
            #如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
            array_push($mokey,$head);
        }
    }
    return $mokey[0];
}

print_r(king(10,7));
// 9

二维数组排序

// 二维数组排序,$arr是数据,$keys是排序的健值,$order是排序规则,1是降序,0是升序
function array_sort(array $arr,string $keys,int $order = 0){
    $arr_keys = [];
    foreach ($arr as $key=>$value){
        $arr_keys[$key] = $value[$keys];
    }
    // 关联数组排序,保持键值关系
    if($order == 0){
        asort($arr_keys);
    }else{
        arsort($arr_keys);
    }
    $new_array = [];
    foreach ($arr_keys as $key => $value){
        $new_array[] = $arr[$key];
    }
    return $new_array;
}

//测试
$person=array(
    array('id'=>2,'name'=>'zhangsan','age'=>23),
    array('id'=>8,'name'=>'dddd','age'=>28),
    array('id'=>5,'name'=>'lisi','age'=>28),
    array('id'=>3,'name'=>'apple','age'=>17)
);
$result = array_sort($person,'id',1);
echo '<pre>';
print_r($result);
echo '</pre>';

顺序查找

/**
 * 顺序查找
 * @param array $arr 数组
 * @param string $key 要查找的元素
 * @return int
 */
function seq_search(array $arr,string $key){
    for($i = 0;$i<count($arr);$i++){
        if($arr[$i] == $key){
            return $i;
        }
    }
    return -1;
}

二分查找法

/**
 * 二分查找,要求需要先排好序
 * @param array $arr 排好序的数组
 * @param int $low 数组起始元素下标
 * @param int $high 数组末尾元素下标
 * @param mixed $key 要查找的元素
 * @return float|int 成功返回数组下标,失败返回-1
 */
function bin_search(array $arr,int $low,int $high,$key){
    if($low <= $high){
        $mid = intval(($low + $high) / 2);
        if($key == $arr[$mid]){
            return $mid;
        }elseif ($key < $arr[$mid]){
            return bin_search($arr,$low,$mid-1,$key);
        }else{
            return bin_search($arr,$mid+1,$high,$key);
        }
    }
    return -1;
}

// 需要先对数组排好序
$arr = [5,9,15,25,34,47,55,76];
sort($arr);
$low = 0;
$high = count($arr) - 1;
echo bin_search($arr,$low,$high,55);

洗牌算法

// 洗牌算法
function wash_card($card_num){
    $cards = $temp = [];
    for ($i = 0;$i<$card_num;$i++){
        $temp[$i] = $i;
    }

    for ($i = 0;$i<$card_num;$i++){
        $index = rand(0,$card_num-$i-1);
        $cards[$i] = $temp[$index];
        unset($temp[$index]);
        $temp = array_values($temp);
    }
    return $cards;
}

echo '<pre>';
print_r(wash_card(54));
echo '</pre>';

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇