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.rhkb.cn/news/125604.html

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

相关文章

Python多进程爬取电影信息

观察翻页时详情页面url地址变化规律 import json from os import makedirs from os.path import exists import requests import logging import re from urllib.parse import urljoin import multiprocessing# 定义了下日志输出级别和输出格式 logging.basicConfig(levellog…

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…

基于uwb和IMU融合的三维空间定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..........................................................................kkk 0; for E…

【初识Git工具】Git工具的基本介绍

【初识Git工具】Git工具的基本介绍 一、什么是Git?1.1 Git简介1.2 Git和SVN区别1.3 常用的Git工具二、Git的起源三、Git的优点四、Git的架构五、Git的基本概念5.1 仓库(Repository)5.2 版本(Commit)5.3 分支(Branch)5.4 合并(Merge)5.5 标签(Tag)六、Git的基本使用命…

【特殊文本文件——Properties和xml文件】

特殊文本文件 一、Properties 是一个Map集合&#xff08;键值对集合&#xff09;&#xff0c;但是我们一般不会当集合用核心作用&#xff1a;Properties是用来代表属性文件的&#xff0c;通过Properties可以读写属性文件里的内容 1.使用Properties读取属性文件里的键值对数据…

【个人博客系统网站】统一处理 · 拦截器

【JavaEE】进阶 个人博客系统&#xff08;2&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;2&#xff09;1. 统一返回格式处理1.1 统一返回类common.CommonResult1.2 统一返回处理器component.ResponseAdvice 2. 统一异常处理3. 拦截器实现3.1 全局变量SESSI…

宏定义天坑记录

宏定义天坑记录 事件原委与推理过程 在编译一个使用了Protobuf的项目时出现了如下报错 [ybVM-8-7-centos boost_searcher]$ make g -o http_server http_server.cc data/raw_html.pb.cc -stdc11 -lboost_system -lboost_filesystem -lpthread -ljsoncpp -lprotobuf In file…

etcd选举源码分析和例子

本文主要介绍etcd在分布式多节点服务中如何实现选主。 1、基础知识 在开始之前&#xff0c;先介绍etcd中 Version, Revision, ModRevision, CreateRevision 几个基本概念。 1、version 作用域为key&#xff0c;表示某个key的版本&#xff0c;每个key刚创建的version为1&#…

【猿灰灰赠书活动 - 05期】- 【速学Linux:系统应用从入门到精通】

&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f468;‍&#x1f4bb;本文简述&#xff1a;博文为大家争取福利&#xff0c;与机械工业出版社合作进行送书活动 &#x1f468;‍&#x1f…

【虚拟机】

虚拟机 简介VMware Workstation简介下载安装许可证密钥 CentOS简介下载 创建新的虚拟机 简介 虚拟机&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;是一种软件模拟的计算机&#xff0c;它在一台物理计算机上创建了一个独立的虚拟计算环境。这个虚拟环境可以运行操…

在线实时监测离子风机的功能

离子风机是一种能够通过释放大量负离子来净化空气并提供清新环境的设备。要实现联网实时在线监测离子风机&#xff0c;可以考虑以下几个步骤&#xff1a; 1. 设备接入互联网&#xff1a;离子风机需要具备网络连接功能&#xff0c;可以通过无线网络或者以太网接入路由器&#x…

[uni-app] 海报图片分享方案 -canvas绘制

文章目录 canvas使用记录先看下实际效果图绘制流程及思路1. 绘制头像, 通过drawImage来绘制2.绘制文字部分 具体代码 分享海报图片的方式,以前再RN端采用的是截图方案, 我记得组件好像是 react-native-view-shot 现在要处理uni-app的海报图片分享, 一般也有 html2canvas的相关插…

索尼 toio™应用创意开发征文|联盟国战

✨ 能用众力&#xff0c;则无敌于天下矣&#xff1b;能用众智&#xff0c;则无畏于圣人矣。 —— 孙权 前言&#xff1a; 从火爆全网的ChatGPT&#xff0c;到人人都是开发者。AI无疑贯彻了整个2023年的主题&#xff0c;从刚上幼儿园的小朋友到耄耋之年的老顽童&#xff0c;都对…

0基础学习VR全景平台篇 第96篇:VR电子楼书

大家好&#xff0c;欢迎观看蛙色VR官方系列课程——VR电子楼书&#xff01; 作为2021年底全新上线的行业解决方案&#xff0c;是专门针对地产、园区数字化营销的一站式VR解决方案&#xff0c;为行业潜在客户提供优质的7x24小时线上看房体验。 本期教程将通过功能介绍后台操作&…

SpringBoot项目集成Druid

文章目录 一、前言二、Druid相关内容1、Druid简介1.1数据库连接池 2、项目集成Druid2.1、环境准备2.2、依赖准备2.3、编写配置文件2.4、测试访问 3、功能介绍3.1、查看数据源3.2、SQL监控3.3、URI监控 三、总结提升 一、前言 本文将介绍Druid的相关内容以及项目如何集成Druid&…

C#,《小白学程序》第十二课:日历的编制,时间DateTime的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十二课&#xff1a;日历的编制&#xff0c;时间DateTime的计算方法与代码 /// 本课学习时间类型的数据 DateTime 的简单方法&#xff0c;并编制一个月的日历。 /// </summary> /// <param name"sender"…

OpenWrt系统开发笔记

openWrt英文官网&#xff1a; https://openwrt.org/ 中文官网&#xff1a; http://www.openwrt.org.cn/ 一、开发环境及编译 在github上有两个源码使用的比较多   一个是lede,地址为&#xff1a;https://github.com/coolsnowwolf/lede   另一个为OpenWrt的官方源码&#…

笔记 | 排序算法实现(Python)

排序算法 一、选择排序二、合并/归并排序三、快速排序四、计数排序 排序类型时间复杂度选择排序(Selection Sort) O ( n 2 ) O(n^{2} ) O(n2)合并/归并排序&#xff08;Merge Sort&#xff09; O ( n log ⁡ n ) O(n\log n ) O(nlogn)快速排序(Quick Sort)平均情况 O ( n log ⁡…

STM32F4X RTC

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