PHP 零基础入门笔记(15):算法 algorithm

简介: PHP 零基础入门笔记(15):算法 algorithm

冒泡排序

两两比较,顺序错误就交换,直到该数列已经完成排序


算法思路


比较相邻的元素,顺序不对就交换


代码实现


<?php
// 将数组由小到大排序
$arr = [3, 4, 2, 8, 9, 1, 6];
// 每次遍历将最大值放在最右边
for($i = 0, $len = count($arr); $i < $len; $i++){
    // 将大值的放在右边
    for($j = 0, $len = count($arr); $j < $len - 1 - $i; $j++){
        // 如果左边的值比右边的大,就交换位置
        if($arr[$j] > $arr[$j + 1]){
            $temp = $arr[$j];
            $arr[$j] = $arr[$j + 1];
            $arr[$j + 1] = $temp;
        }
    }
}
echo json_encode($arr);
// [1,2,3,4,6,8,9]

选择排序

每次从待排的数据中选择最小或最大的一个元素,放在起始位置,直到全部待排序的元素排完


<?php
// 将数组由小到大排序
$arr = [3, 4, 2, 8, 9, 1, 6];
// 1、需要选择的次数,每次只能选择一个最大或者最小值
for($i = 0, $len = count($arr); $i < $len; $i++){
    // 2、假设第一个值就是最小值
    $min = $i;
    // 3、将最小值和其他剩余值一一比较
    for($j = 1 + $i, $len = count($arr); $j < $len; $j++){
        // 4、找到最小值
        if($arr[$min] > $arr[$j]){
            $min = $j;
        }
    }
    // 5、当前值与最小值交换位置
    if($min != $i){
        $temp = $arr[$i];
        $arr[$i] = $arr[$min];
        $arr[$min] = $temp;
    }
}
echo json_encode($arr);
// [1,2,3,4,6,8,9]

插入排序

将一个数据插入到已排序数据中


<?php
// 将数组由小到大排序
$arr = [3, 4, 2, 8, 9, 1, 6];
// 1、循环次数,插入次数 length - 1,第一个数已经是有序的了
for($i = 1, $len = count($arr); $i < $len; $i++){
    // 待插入数据
    $temp = $arr[$i];
    // 2、前面的序列是已排序区域
    for($j = $i - 1; $j >= 0; $j--){
        // 3、将该值插入到合适的位置
        if($arr[$j] > $temp){
            // 有序数组后移一位
            $arr[$j + 1] = $arr[$j];
            $arr[$j] = $temp;
        } else{
            // 该值最大,位置正确
            break;
        }
    }
}
echo json_encode($arr);
// [1,2,3,4,6,8,9]

优化版本, 减少交换次数


<?php
// 将数组由小到大排序
$arr = [3, 4, 2, 8, 9, 1, 6];
// 1、循环次数,插入次数 length - 1,第一个数已经是有序的了
for($i = 1, $len = count($arr); $i < $len; $i++){
    // 待插入数据
    $temp = $arr[$i];
    // 记录插入位置
    $insert_index = -1;
    // 2、前面的序列是已排序区域
    for($j = $i - 1; $j >= 0; $j--){
        // 3、将该值插入到合适的位置
        if($arr[$j] > $temp){
            // 有序数组后移一位
            $arr[$j + 1] = $arr[$j];
            // $arr[$j] = $temp;
            $insert_index = $j;
        } else{
            // 该值最大,位置正确
            break;
        }
    }
    // 如果位置有变动,交换数据
    if($insert_index > -1){
        $arr[$insert_index] = $temp;
    }
}
echo json_encode($arr);
// [1,2,3,4,6,8,9]

快速排序

不稳定排序


冒泡排序的改进,通过一趟排序将要排序的数据分割为独立的两部分,其中一部分的数据都比另外一部分所有数据都要小,然后重复此过程


排序步骤:


从数组中选出一个元素(通常是第一个),作为参照

定义两个数组,将目标数组中剩余元素与参照元素挨个比较,小的放到一组,大的放到另一组

第二步执行完后,前后数组顺序不确定,但是确定了自己的位置

将得到的小数组按照第1步第3步,重复操作(子问题)

回溯最小数组(第一个元素)

<?php
// 将数组由小到大排序
$arr = [3, 4, 2, 8, 9, 1, 6];
/**
 * 快速排序
 */
function quick_sort($arr){
    // 递归出口
    $len = count($arr);
    if($len <= 1){
        return $arr;
    }
    // 定义两个数组,分别存小数和大数
    $left = [];
    $right = [];
    for($i = 1; $i < $len; $i++){
        // 比较:小的放左边,大的放右边
        if($arr[$i] < $arr[0]){
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }
    // 递归点:将两个数组继续排序
    $left = quick_sort($left);
    $right = quick_sort($right);
    // 和并数组返回
    return array_merge($left, [$arr[0]], $right);
}
echo json_encode(quick_sort($arr));
// [1,2,3,4,6,8,9]

归并排序

分治算法


二路归并


<?php
// 将数组由小到大排序
$arr1 = [2, 3, 4, 8];
$arr2 = [1, 6, 9];
// 定义归并空间
$arr3 = [];
while(count($arr1) && count($arr2)){
    // 每次取出一个最小值
    $arr3[] = $arr1[0] < $arr2[0] ? array_shift($arr1): array_shift($arr2);
}
// 合并结果
$ret = array_merge($arr3, $arr1, $arr2);
echo json_encode($ret);
// [1,2,3,4,6,8,9]
<?php
// 将数组由小到大排序
$arr = [3, 4, 2, 8, 9, 1, 6];
function merge_sort($arr){
    // 递归出口
    $len = count($arr);
    if($len <= 1){
        return $arr;
    }
    // 拆分为两个数组
    $middle_index = floor($len/2);
    $left = array_slice($arr, 0, $middle_index);
    $right = array_slice($arr, $middle_index);
    // 递归点
    $left = merge_sort($left);
    $right = merge_sort($right);
    // 定义归并空间
    $merge_array = [];
    while(count($left) && count($right)){
        // 每次取出一个最小值
        $merge_array[] = $left[0] < $right[0] ? array_shift($left): array_shift($right);
    }
    // 合并结果
    return array_merge($merge_array, $left, $right);
}
// 合并结果
$ret = merge_sort($arr);
echo json_encode($ret);
// [1,2,3,4,6,8,9]

顺序查找

按照列表顺序,依次查找


<?php
/**
 * 顺序查找,逐项匹配
 */
function order_find($arr, $value){
    for($i = 0, $len = count($arr); $i < $len; $i++){
        // 判断
        if($arr[$i] == $value){
            return $i;
        }
    }
    return -1;
}
$arr = [3, 4, 2, 8, 9, 1, 6];
$ret = order_find($arr, 1);
var_dump($ret);
// int(5)

二分查找

要求元素组有序,先与中间节点比较,分成两个子表,确定继续在哪个子表查找,递归进行


折半查找


<?php
/**
 * 二分查找,从中间的值开始比较
 */
function binary_find($arr, $value){
    // 边界条件
    $left = 0;
    $right = count($arr);
    // 循环匹配
    while($left <= $right){
        // 每次循环获取中间值
        $middle = floor(($left + $right) / 2);
        if($value > $arr[$middle]){
            $left = $middle + 1;
        } else if($value < $arr[$middle]){
            $right = $middle - 1;
        } else{
            return $middle;
        }
    }
    return -1;
}
// 有序数组
$arr = [1, 2, 4, 8, 9, 13, 16];
$ret = binary_find($arr, 9);
var_dump($ret);
// float(4)

相关文章
|
7月前
|
监控 算法 安全
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
122 1
|
5月前
|
监控 算法 安全
基于 PHP 的员工电脑桌面监控软件中图像差分算法的设计与实现研究
本文探讨了一种基于PHP语言开发的图像差分算法,用于员工计算机操作行为监控系统。算法通过分块比较策略和动态阈值机制,高效检测屏幕画面变化,显著降低计算复杂度与内存占用。实验表明,相比传统像素级差分算法,该方法将处理时间缩短88%,峰值内存使用量减少70%。文章还介绍了算法在工作效率优化、信息安全防护等方面的应用价值,并分析了数据隐私保护、算法准确性及资源消耗等挑战。未来可通过融合深度学习等技术进一步提升系统智能化水平。
79 2
|
5月前
|
存储 监控 算法
内网监控桌面与 PHP 哈希算法:从数据追踪到行为审计的技术解析
本文探讨了内网监控桌面系统的技术需求与数据结构选型,重点分析了哈希算法在企业内网安全管理中的应用。通过PHP语言实现的SHA-256算法,可有效支持软件准入控制、数据传输审计及操作日志存证等功能。文章还介绍了性能优化策略(如分块哈希计算和并行处理)与安全增强措施(如盐值强化和动态更新),并展望了哈希算法在图像处理、网络流量分析等领域的扩展应用。最终强调了构建完整内网安全闭环的重要性,为企业数字资产保护提供技术支撑。
137 2
|
6月前
|
存储 监控 算法
公司员工电脑监控软件剖析:PHP 布隆过滤器算法的应用与效能探究
在数字化办公的浪潮下,公司员工电脑监控软件成为企业管理的重要工具,它能够帮助企业了解员工的工作状态、保障数据安全以及提升工作效率。然而,随着监控数据量的不断增长,如何高效地处理和查询这些数据成为了关键问题。布隆过滤器(Bloom Filter)作为一种高效的概率型数据结构,在公司员工电脑监控软件中展现出独特的优势,本文将深入探讨 PHP 语言实现的布隆过滤器算法在该软件中的应用。
102 1
|
6月前
|
存储 监控 算法
单位电脑监控软件中 PHP 哈希表算法的深度剖析与理论探究
数字化办公的时代背景下,单位电脑监控软件已成为企业维护信息安全、提升工作效率的关键工具。此类软件可全面监测员工的电脑操作行为,收集海量数据,故而高效管理和处理这些数据显得尤为重要。数据结构与算法在此过程中发挥着核心作用。本文将聚焦于哈希表这一在单位电脑监控软件中广泛应用的数据结构,并通过 PHP 语言实现相关功能,为优化单位电脑监控软件提供技术支持。
101 3
|
6月前
|
存储 监控 算法
论内网电脑监控软件中 PHP 哈希表算法的深度剖析与探究
当代企业网络管理体系中,内网电脑监控软件占据着关键地位。其功能涵盖对员工电脑操作行为的实时监测,以此维护企业信息安全,同时助力企业优化网络资源配置,提升整体工作效能。在构建内网电脑监控软件的诸多技术中,数据结构与算法构成了核心支撑体系。本文聚焦于哈希表这一重要数据结构,深入剖析其在 PHP 语言环境下,如何为内网电脑监控软件的高效运作提供助力,并通过详实的代码示例予以阐释。
93 3
|
7月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
157 3
|
7月前
|
存储 监控 算法
基于 PHP 二叉搜索树算法的内网行为管理机制探究
在当今数字化网络环境中,内网行为管理对于企业网络安全及高效运营具有至关重要的意义。它涵盖对企业内部网络中各类行为的监测、分析与管控。在内网行为管理技术体系里,算法与数据结构扮演着核心角色。本文将深入探究 PHP 语言中的二叉搜索树算法于内网行为管理中的应用。
72 4
|
7月前
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
98 7
|
8月前
|
监控 算法 安全
关于公司电脑桌面监控中 PHP 二叉搜索树算法的深度剖析
在现代企业管理中,公司电脑桌面监控系统通过二叉搜索树(BST)算法保障信息安全和提高效率。本文探讨PHP中的BST在监控场景的应用,包括节点定义、插入与查找操作,并展示如何管理时间戳数据,以快速查询特定时间段内的操作记录。BST的高效性使其成为处理复杂监控数据的理想选择。
68 2

热门文章

最新文章