php常用算法

news2024/12/23 22:57:02

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。作为一个初级phper,虽然很少接触到算法方面的东西 。但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的。

 

冒泡排序算法

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,依次比较两个元素,如果他们的顺序错误就把他们交换过来。

/**
 * @param $arr
 * @return mixed
 *
 * 冒泡排序算法的原理如下(效率比较低):
 * 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
 * 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
 * 3.针对所有的元素重复以上的步骤,除了最后一个。
 * 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
 */
   function bubble($arr)
   {
        if (!is_array($arr)) {
            return '参数必须是一个一维数组';
        }
        $len = count($arr);

        //获取 长度
        $len = count($arr);
        //循环比较(相邻的两个元素,比较,交换)
        for ($k = 0; $k <= $len; $k++) {
            for ($j = $len - 1; $j > $k; $j--) {
                //比较
                if ($arr[$j] < $arr[$j - 1]) {
                    //交换
                    $temp = $arr[$j];
                    $arr[$j] = $arr[$j - 1];
                    $arr[$j - 1] = $temp;
                }
            }
        }
        return $arr;
    }
 
// 先定义一个数组
$arr = ['9', '2', '4', '1', '7', '3', '5', '8'];
$fun = bubble($arr);
var_dump($fun);

插入排序算法

插入排序的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在一排序序列中从后向前扫描,找到相应的位置并插入。

 /**
 * @param $arr
 * @return mixed
 *
 * 插入排序算法的原理如下:
 * 1.从第一个元素开始,该元素可以认为已经被排序。
 * 2.取出下一个元素,在已经排序的元素序列中从后向前扫描。
 * 3.如果该元素(已排序)大于新元素,将该元素移到下一个位置。
 * 4.重复步骤 ③,直到找打已排序的元素小于或者等于新元素的位置。
 * 5.将新元素插入到该位置中。
 * 6.重复步骤2
 */
function insert_sort($arr){
 
    $len=count($arr);
 
    for($i=1; $i<$len; $i++) {
 
        //获得当前需要比较的元素值。
        $tmp = $arr[$i];
 
        //内层循环控制 比较 并 插入
        for($j=$i-1; $j>=0; $j--) {
 
            //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
            if($tmp < $arr[$j]) {
 
                //发现插入的元素要小,交换位置
                //将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
 
                //将前面的数设置为 当前需要交换的数
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移动的元素
                //由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    //将这个元素 插入到已经排序好的序列内。
    //返回
    return $arr;
 
}

$arr=array(1,43,54,62,21,66,32,78,36,76,39);
print_r(insert_sort($arr));

选择排序算法

选择排序是一种简单直观的排序算法。它的工作原理如下:首先是在末排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从 剩余未排序元素中继续寻找最小元素。然后放到排序序列末尾。以此类推,直到所有元素均排序完成。

 /**
 * @param $arr
 * @return mixed
 *
 * 选择排序算法的原理如下(比冒泡效率高):
 * 1.外层决定循环层数
 * 2.选择排序就是默认当前值为最小值,记录下标,然后进行循环比较,记录最小(最大)值的下标,最后交换两者的值。这样第一个值就是最小(最大)值。
 * 3.然后,依次,循环下去。最后得到的就是有序的数组
 */
function select_sort($arr) {
 
    //$i 当前最小值的位置, 需要参与比较的元素
    for($i=0, $len=count($arr); $i<$len-1; $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;
}


$arr=array(1,43,54,62,21,66,32,78,36,76,39);
print_r(select_sort($arr));
 

快速排序算法

快速排序是由东尼·霍尔发展的一种排序算法。在平均状况下 ,排序n个项目要O(n log n)次比较。

/**
 * @param $arr
 * @return array
 *
 * 快速排序算法原理如下:
 *  1.通过设置一个初始中间值,来将需要排序的数组分成3部分:小于中间值的左边,中间值,大于中间值的右边
 *  2.继续递归用相同的方式来排序左边和右边
 *  3.最后合并数组
 */

function quick_sort($arr) {  
    //先判断是否需要继续进行  
    $length = count($arr);  
    if($length <= 1) {  
        return $arr;  
    }  
    //如果没有返回,说明数组内的元素个数 多余1个,需要排序  
    //选择一个标尺  
    //选择第一个元素  
    $base_num = $arr[0];  
    //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内  
    //初始化两个数组  
    $left_array = array();//小于标尺的  
    $right_array = array();//大于标尺的  
    for($i=1; $i<$length; $i++) {  
        if($base_num > $arr[$i]) {  
            //放入左边数组  
            $left_array[] = $arr[$i];  
        } else {  
            //放入右边  
            $right_array[] = $arr[$i];  
        }  
    }  
    //再分别对 左边 和 右边的数组进行相同的排序处理方式  
    //递归调用这个函数,并记录结果  
    $left_array = quick_sort($left_array); 
    $right_array = quick_sort($right_array);  
    //合并左边 标尺 右边  
    return array_merge($left_array, array($base_num), $right_array); 
}
$arr = array(1,98,5,34,23,87,54,23,12,0,456,123,45);
$res = quick_sort($arr);  
print_r($res);die;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/989733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论机器生产内容 MGC 与新数字时代的两个世界

摘要&#xff1a;本文从新数字时代人类社会的两种存在形态&#xff1a;数字世界&#xff08;元宇宙&#xff09;与物理世界&#xff08;时空宇宙&#xff09;&#xff0c;以及新兴数字产业&#xff1a;机器生产内容MGC的发展、现状与未来出发&#xff0c;通过对新数字时代及两个…

Mysql 入门篇之二进制安装

文章目录 Mysql 5.7 入门安装卸载自带组件下载二进制包安装配置 Mysql 8.0 入门安装卸载自带组件下载二进制包安装配置 Mysql 5.7 入门安装 环境说明&#xff1a;CentOS Linux release 7.6.1810 (Core) 4核4G 卸载自带组件 卸载自带的mysql相关组件 rpm -qa | grep mysql rpm…

jemalloc 5.3.0源码总结

注意&#xff1a;jemalloc 的最新版本里没有所谓的 huge class&#xff0c;bin 中slab外面也不再套一个run的概念了&#xff0c;看其它人分享的文章时需要注意。 简述 用户侧通过 tcache 来访问&#xff0c;tcache 是一个线程的申请又释放的对象的缓存&#xff0c;它绑定了一…

紫光电子档案管理系统存在SQL注入漏洞(漏洞复现)

文章目录 紫光电子档案管理系统存在SQL注入漏洞&#xff08;漏洞复现&#xff09;0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 紫光电子档案管理系统存在SQL注入漏洞&#xff08;漏洞复现&#xff09; 0x01 前言 本次测试仅…

数据结构与算法-----指针与结构体

目录 前言 指针 定义 示例1&#xff08;访问修改数据&#xff09;&#xff1a; 示例2&#xff08;野指针&#xff09;&#xff1a; 示例3&#xff08;动态空间分配问题&#xff09;&#xff1a; 示例4&#xff08;字符串赋值错误问题&#xff09;&#xff1a; 示例5&am…

2023年限售股解禁研究报告

第一章 概述 解禁是指限售流通股过了限售承诺期&#xff0c;可以在二级市场自由买卖的过程。根据流通性质&#xff0c;可将上市公司股份分为有限售条件的流通股&#xff08;“限售流通股”&#xff09;及无限售条件的流通股&#xff08;“流通股”&#xff09;。 限售流通股指…

案例实战-Spring boot Web

准备工作 需求&环境搭建 需求&#xff1a; 部门管理&#xff1a; 查询部门列表 删除部门 新增部门 修改部门 员工管理 查询员工列表&#xff08;分页、条件&#xff09; 删除员工 新增员工 修改员工 环境搭建 准备数据库表&#xff08;dept、emp&#xff09; -- 部门管理…

NLP(3)--GAN

目录 一、概述 二、算法过程 三、WGAN 1、GAN的不足 2、JS散度、KL散度、Wasserstein距离 3、WGAN设计 四、Mode Collapse and Mode Dropping 1、Mode Collapse 2、Mode Dropping 3、FID 四、Conditional GAN 一、概述 GAN&#xff08;Generative Adversial Networ…

【云原生进阶之PaaS中间件】第一章Redis-1.7发布订阅模式

1 Redis 发布订阅 1.1 概述 发布订阅模式&#xff08;Publish-Subscribe Pattern&#xff09;是一种消息传递模式&#xff0c;其基本原理是消息的发送者&#xff08;发布者&#xff09;不会直接发送消息给特定的接收者&#xff08;订阅者&#xff09;&#xff0c;而是将消息分…

基于SpringBoot的无忌在线考试系统(源码+讲解+调试运行)做毕设课设均可

技术栈 前后端分离 前端使用: Vue Element Plus 后端使用: SpringBoot Mysql8.0 Mybatis-Plus 功能 分为 管理员端 和 老师端 和 学生端 管理员端 登陆页 ​科目管理 查看所有科目 ,增加 ,修改 ,删除科目 , 模糊搜索课程 ​考试管理 查看所有考试 ,增加 ,修改 ,删除考试 题库…

Linux之Shell变量和引用

目录 深入认识变量 什么是变量 变量的名称 组成 规则 变量的类型 原则 shell的变量数据类型 变量定义 原则 格式 案例 自定义变量 定义 引用变量的值 查看变量 环境变量 定义 定义环境变量 案例 --- 三种方法定义 对比 shell环境变量存储的文件 位置变量…

Python - PyQt6、QDesigner、pyuic5-tool 安装使用

Python 开发可视化界面可以使用原生的 tkinter&#xff0c;但是原生框架使用起来颇为不方便&#xff0c;所以最流行的还是QT UI框架&#xff0c;QT是使用C语言开发&#xff0c;Python 想使用需要对其进行封装&#xff0c;所以就出现了PyQt框架&#xff0c;这个框架使用极其方便…

c语言练习44:深入理解strstr

深入理解strstr strstr作用展示&#xff1a; #include <stdio.h> #include <string.h> int main() {char str[] "This is a simple string";char* pch;pch strstr(str, "simple");/*strncpy(pch, "sample", 6);*/printf("%s…

向量数据库Milvus Cloud核心组件再升级,主打就是一个低延迟、高准确度

支持 ScaNN 索引 Faiss 实现的 ScaNN,又名 FastScan,使用更小的 PQ 编码和相应的指令集可以更为友好地访问 CPU 寄存器,从而使其拥有优秀的索引性能。该索引在 Cohere 数据集,Recall 约 95% 的时候,Milvus 使用 Knowhere 2.x 版本端到端的 QPS 是 IVF_FLAT 的 7 倍,HN…

JDBC入门到精通-10w总结

JDBC核心技术 笔记是以尚硅谷讲师宋红康JDBC课程为基础&#xff0c;加入自身学习体会&#xff0c;略有修改 第1章&#xff1a;JDBC概述 JDBC是java应用程序和数据库之间的桥梁。JDBC提供一组规范&#xff08;接口&#xff09;。向上是面向应用API&#xff0c;共应用程序使用。向…

磐基2.0搭建es集群

参考&#xff1a; k8s安装elasticsearch集群 k8s安装elasticsearch集群_k8s部署elasticsearch集群_MasonYyp的博客-CSDN博客1 环境简述搭建es集群需要使用的技术如下&#xff1a;k8s集群、StatefulSet控制器、Service&#xff08;NodePort&#xff09;服务、PV、PVC、volumeC…

数组的方法以及数组的创建以及概念

5.数组 递归 1.什么是递归? ​ 函数自己调用自己,要有临界点(结束条件) 1.数组的概念(复杂数据类型) 1.什么是数组它就是一组数据,js的数组成员可以是任意类型,它是可以动态扩容的2.数组的创建方式1).构造函数创建数组如果Array里有一个参数,并且是数值类型,表示数组的初始…

ForkJoinPool的使用及基本原理

文章目录 1. 简介2. ForkJoinPool的基本原理2.1 工作窃取算法&#xff08;Work Stealing&#xff09;2.1.1 工作窃取算法的定义和特点2.1.2 工作队列和双端队列的作用与区别 2.2 分治策略&#xff08;Divide and Conquer&#xff09;2.2.1 分治策略的概念和应用场景2.2.2 任务拆…

Linux中的软件管家——yum

目录 ​编辑 一&#xff0c;软件安装的方式 二&#xff0c;对yum的介绍 1.yum的作用 2&#xff0c;yum的库 三&#xff0c;yum下载软件的操作 1.yumlist 2.yuminstall 3.yumremove 四&#xff0c;yum源的转换 一&#xff0c;软件安装的方式 软件安装的方式大概分为三种…

AI消除笔快速去除脸部痘痘疤痕,新手变高手!

美颜的途径有很多&#xff0c;比较实用的是祛痘和柔肤。祛除人物脸部的痘痕有多种方法&#xff0c;比较常见且普遍的就是使用PS“污点去除”工具来去除痘痕&#xff0c;以及柔化皮肤。 除了PS我们还可以使用AI图片消除工具&#xff0c;这就对手残党非常的友好了。 牛学长图片…