php常用算法

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。作为一个初级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.mzph.cn/news/72818.shtml

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

相关文章

Oracle数据库环境变量配置以及可能遇到的问题解决

一、如何配置Oracle数据库环境变量&#xff08;以win10为例&#xff09; 1、找到此电脑&#xff0c;鼠标右键&#xff0c;点击属性。 2、点击属性成功后&#xff0c;进入如下页面&#xff0c;找到“高级系统设置”&#xff0c;点击进入。 3、找到环境变量&#xff0c;点击进入…

STM32F4X RTC

STM32F4X RTC 什么是RTCSTM32F4X RTCSTM32F4X RTC框图STM32F4X RTC计数频率STM32F4X RTC日历STM32F4X RTC闹钟 STM32F4X RTC例程 什么是RTC RTC全程叫Real-Time Clock实时时钟&#xff0c;是MCU中一个用来计时的模块。RTC的一个主要作用是用来显示实时时间&#xff0c;就像日常…

pip安装skimage的方法

在安装skimage时&#xff0c;可能会报错误&#xff1a; 可以尝试&#xff1a;pip install scikit-image进行安装&#xff0c;使用时只需要&#xff1a;import skimage

《消息队列》专栏介绍

《消息队列》专栏介绍 目录 《消息队列》专栏介绍专栏导言什么是消息队列呢&#xff1f;应用场景&#xff08;作用&#xff09; 为什么要用消息队列呢&#xff1f;异步处理削峰填谷 举个例子 分布式消息队列的优势 应用解耦优点发布订阅优点 分布式消息队列应用场景不同消息队列…

武警三维数字沙盘电子沙盘虚拟现实模拟推演大数据人工智能开发教程第15课

部队三维数字沙盘电子沙盘虚拟现实模拟推演大数据人工智能开发教程第15课 现在不管什么GIS平台首先要解决的就是数据来源问题&#xff0c;因为没有数据的GIS就是一个空壳&#xff0c;下面我就目前一些主流的数据获取 方式了解做如下之我见&#xff08;主要针对互联网上的一些…

Linux之Shell概述

目录 Linux之Shell概述 学习shell的原因 shell是什么 shell起源 查看当前系统支持的shell 查看当前系统默认shell Shell 概念 Shell 程序设计语言 Shell 也是一种脚本语言 用途 Shell脚本的基本元素 基本元素构成&#xff1a; Shell脚本中的注释和风格 Shell脚本编…

期货基础知识

一、期货是什么&#xff1f;  期货是与现货相对应&#xff0c;并由现货衍生而来。期货通常指期货合约&#xff0c;期货与现货完全不同&#xff0c;现货是实实在在可以交易的货&#xff08;商品&#xff09;&#xff0c;期货主要不是货&#xff0c;而是以某种大众产品如棉花、大…

2023-大数据应用开发-工业数据实时处理-参考结果

工业数据实时处理-答案 任务一&#xff1a;实时数据采集 1、 在主节点使用Flume采集/data_log目录下实时日志文件中的数据&#xff0c;将数据存入到Kafka的Topic中&#xff08;Topic名称分别为ChangeRecord、ProduceRecord和EnvironmentData&#xff0c;分区数为4&#xff09…

vue响应式详解

1. 响应式的定义 我们都知道&#xff0c;vue是基于javascript的&#xff0c;那我们使用一段javascript代码来描述响应式 let a 1,b 1,c; c a b; console.log(c) // 输出 2 // 改变 a的值 a 3; // 重新给c赋值 即把 c a b; 再执行一遍c的值才能变为 4 // c a b; // …

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

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

小白学go基础05-变量声明形式

和Python、Ruby等动态脚本语言不同&#xff0c;Go语言沿袭了静态编译型语言的传统&#xff1a;使用变量之前需要先进行变量的声明。 变量声明形式使用决策流程图 这里大致列一下Go语言常见的变量声明形式&#xff1a; var a int32 var s string "hello" var i 13 …

【RabbitMQ】RabbitMQ 服务无法启动。系统出错。发生系统错误 1067。进程意外终止。

问题描述 RabbitMQ 服务无法启动。 rabbitmq-service.bat startRabbitMQ 服务正在启动 . RabbitMQ 服务无法启动。系统出错。发生系统错误 1067。进程意外终止。原因分析 RabbitMQ和Erlang版本不匹配。 解决方案 查询并安装RabbitMQ版本对应Erlang版本 https://www.rabbitm…

如何指定this

<script>/*如何指定this的值可以通过2类方法指定1.调用时指定1.1call方法1.2apply方法2.创建时指定2.1bind方法2.2箭头函数*/// ------1.调用时指定------//1.1call方法:挨个传入参数//1.2apply方法:数组形式传入参数function foo (numA, numB) {console.log(this)consol…

自动化测试基础知识详解

前言 有颜色的标注主要是方便记忆&#xff0c;勾选出个人感觉的重点 块引用&#xff1a;大部分是便于理解的话&#xff0c;稍微看看就行&#xff0c;主要是和正常的文字进行区分的 1、什么是自动化测试 自动化测试是软件测试活动中一个重要分支和组成部分&#xff0c;随着软…

一加11/Ace2/10Pro手机如何实现全局120HZ高刷-游戏超级流畅效果

已经成功root啦。安卓13目前也一样支持LSPosed框架&#xff0c;如果你对LSP框架有需求&#xff0c;也可以使 自测120HZ刷新率诞生以后&#xff0c;很多小伙伴用上了就很难回来啦&#xff0c;一加11/Ace2/10Pro/9pro手 机厂商也对新机做了很多的适配&#xff0c;让我们日常使用起…

nvm管理多个版本的nodejs

1. 已经安装过nodejs在安装nvm的步骤 1.安装nvmhttps://github.com/coreybutler/nvm-windows/releases 2.nvm安装位置 2.nvm管理的nodejs安装位置 4.最终的安装结构 备注&#xff1a;nodejs安装 2.使用nvm安装管理nodejs 2.1配置下载镜像&#xff1a; 找到nvm安装路径…

2023-9-8 满足条件的01序列

题目链接&#xff1a;满足条件的01序列 #include <iostream> #include <algorithm>using namespace std;typedef long long LL;const int mod 1e9 7;int qmi(int a, int k, int p) {int res 1;while(k){if(k & 1) res (LL) res * a % p;a (LL) a * a % p;…

公式trick备忘录

增大不同class feature之间的距离用hinge loss 相关&#xff0c; similarity learning, svm https://www.youtube.com/watch?vQtAYgtBnhws https://www.youtube.com/watch?vbM4_AstaBZo&t286s

java特殊文件 属性文件properties和XML文件

属性文件properties 后缀为.properties的文件&#xff0c;称之为属性文件&#xff0c;它可以很方便的存储一些类似于键值对的数据。经常当做软件的配置文件使用。 首先我们要掌握属性文件的格式&#xff1a; 1.属性文件后缀以.properties结尾 2.属性文件里面的每一行都是一个…

【笔试强训选择题】Day37.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言一、Day…