PHP面试宝典之算法

插入排序

<?php

//插入排序
function insertSort($arr)
{
    //区分哪部分是已经排序好的
    //哪部分是没有排序的
    //找到其中一个需要排序的元素
    //这个元素就是从第二个元素开始,到最后一个元素都是这个需要排序的元素
    //利用循环就可以标志出来
    //i循环控制,每次需要插入的元素,一旦需要插入的元素控制好了,
    //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
    $len = count($arr);

    for ($i = 1; $i < $len; $i++)
    {
        //获得当前需要比较的元素值
        $tmp = $arr[$i];
        //内层循环控制比较并插入
        for ($j = $i-1; $j >= 0; $j--)
        {
            //$arr[$j],需要插入的元素,$arr[$j],需要比较的元素
            if ($tmp < $arr[$j])
            {
                //发现插入的元素要小,互换位置
                //将后边的元素与前面的元素交换
                $arr[$j+1] = $arr[$j];
                //将前面的数设置为当前需要交换的数
                $arr[$j]   = $tmp;
            }
            else
            {
                //如果碰到不需要移动的元素
                //由于是已经排序好的数组,则前面的就不需要再次比较了
                break;
            }
        }
    }
    //将这个元素插入到已经排序好的序列内
    //返回
    return $arr;
}

$sortArr = [1, 2, 3, 4, 10, 11, 34, 56, 12, 23, 98, 5];
echo '<pre>';
var_dump(insertSort($sortArr));

二分查找

<?php


/**
 * 二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,有点类似分治的思想。
 * 二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,
 * 将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。
 *
 * 循环写法
 * @param array $array      待查找的数组
 * @param int $findVal      要查找的值
 * @return int              返回找到的数组键
 */
function binarySearch(array $array, int $findVal)
{
    // 非数组或者数组为空,直接返回-1
    if (empty($array)) {
        return -1;
    }
    // 查找区间,起点和终点
    $start = 0;
    $end   = count($array) - 1;
    while ($start <= $end)
    {
        // 以中间点作为参照点比较,取整数
        $middle = intval(($start + $end) / 2);

        if ($array[$middle] > $findVal)
        {
            // 查找数比参照点小,则要查找的数在左半边
            // 因为 $middle 已经比较过了,这里需要减1
            $end = $middle - 1;

        }
        elseif ($array[$middle] < $findVal)
        {
            // 查找数比参照点大,则要查找的数在右半边
            // 因为 $middle 已经比较过了,这里需要加1
            $start = $middle + 1;

        }
        else
        {
            // 查找数与参照点相等,则找到返回
            return $middle;
        }
    }
    // 未找到,返回-1
    return -1;
}

// 调用
$array = [10,12,16,19,20,34,56,78,84,95,100];
echo binarySearch($array, 84);

冒泡排序

<?php

//冒泡排序
function bubbleSorting($sortArr)
{
    $count = count($sortArr);
    if($count <= 0) return false;//如果数组是空的,返回错误

    //第一层循环
    for ($i = 0; $i < $count-1; $i++)
    {
        //第二层循环
        for($j = 0; $j < $count-$i-1; $j++)
        {
            //当前值大于后面的值,就将后面的值挪前面去,前面的值挪后面去,(从小到大排)
            if ($sortArr[$j] > $sortArr[$j+1])
            {
                $temp          =  $sortArr[$j];
                $sortArr[$j]   = $sortArr[$j+1];
                $sortArr[$j+1] = $temp;
            }
        }
    }
    echo "<pre>";
    var_dump($sortArr);
}

$sortArr = [1, 2, 3, 4, 10, 11, 34, 56, 12, 23, 98, 5];
bubbleSorting($sortArr);

快速排序

<?php

//快速排序
function quickSort($array)
{
    //只有一个元素,直接返回
    $count = count($array);
    if($count <= 1) return $array;

    //获取第一个元素,作为比较值
    $key       = $array[0];
    $left_arr  = [];
    $right_arr = [];
    //从第二个元素开始进行比较,小于第一个元素的,放左边数组,大于第一个元素的放右边数据
    for ($i = 1; $i < $count; $i++)
    {
        if ($key > $array[$i])
        {
            $left_arr[] = $array[$i];
        }
        else
        {
            $right_arr[] = $array[$i];
        }
    }
    //递归调用,直到将两边数组中,所有数据都转移到一方为止,说明已经比较结束,合并左数组、比较值、右数组返回即可
    $left_arr  = quickSort($left_arr);
    $right_arr = quickSort($right_arr);
    return array_merge($left_arr, [$key], $right_arr);
}

$sortArr = [1, 2, 3, 4, 10, 11, 34, 56, 12, 23, 98, 5];
echo '<pre>';
var_dump(quickSort($sortArr));

查找数组中,唯一重复元素

<?php

//查找,数组中,唯一重复元素
function searchArrayRepeat($arr):int
{
    //先排序
    sort($arr);
    $count = count($arr);
    $temp  = $arr[0];
    //将前一个元素赋值给临时变量,然后循环比较,当后一个元素等于临时变量,说明重复,即返回
    //前后一个元素不等于临时变量,将该元素赋值给临时变量,去跟再下一个元素比较,直到比较完为止
    for ($i = 1; $i < $count; $i++)
    {
        if ($temp == $arr[$i])
        {
            return $temp;
        }
        else
        {
            $temp = $arr[$i];
        }
    }
    return false;
}
$arr = [1, 2, 3, 3, 4, 5, 6];

var_dump(searchArrayRepeat($arr));

斐波那契数列

<?php


//斐波那契数列:又称黄金分割数列、兔子数列
//1、1、2、3、5、8、13、21、34、……
//除前两个是1外,从第三个开始,值=前两个数的和


$arr[0] = 1;
$arr[1] = 1;
for ($i = 2; $i < 100; $i++)
{
    $arr[$i] = $arr[$i - 1] + $arr[$i - 2];
}
//echo join(",", $arr);  //将数组合并为一个字符串输出
echo '<pre>';
var_dump($arr);

选择排序

<?php

function selectSort($arr)
{
    $len = count($arr);
    //实现思路,双重循环完成,外层控制轮数,当前的最小值。内层控制比较次数
    //$i 当前最小值的位置,需要参与比较的元素
    for ($i = 0; $i < $len; $i++)
    {
        //先假设最小的值的位置
        $p = $i;
        //$j 当前都需要和哪些元素比较,$i后边的
        for ($j = $i+1; $j < $len; $j++)
        {
            //$arr[$p]是当前已知的最小值
            if ($arr[$p] > $arr[$j])
            {
                //比较,发现更小的,记录下最小值的位置,并且在下次比较时,
                //应该采用已知的最小值进行比较
                $p = $j;
            }
        }
        //已经确定了当前的最小值的位置,保存到$p中
        //如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可
        if ($p != $i)
        {
            $tmp     = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最终结果
    return $arr;
}

$sortArr = [1, 2, 3, 4, 10, 11, 34, 56, 12, 23, 98, 5];
echo '<pre>';
var_dump(selectSort($sortArr));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值