【PHP + 代码审计】数组排序算法

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

目录

冒泡排序

选择排序

插入排序

快速排序

查找算法

查找算法含义

顺序查找算法

二分查找算法


冒泡排序

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

冒泡排序的算法思路:

1) 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2) 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3) 针对所有的元素重复以上的步骤,除了最后一个。

4) 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

<?php
//数组排序算法,冒泡排序$arr = array(1, 3, 6, 5, 8, 9);// 外层循环每次找出最大值的代码重复执行
for ($i = 0, $len = count($arr); $i < $len - 1; $i++) {// 内层循环将最大的值放到最右边for ($j = 0; $j < $len - 1 - $i; $j++) {// 判断:两两相比if ($arr[$j] > $arr[$j + 1]) {// 左边比右边大:交换$temp = $arr[$j];$arr[$j] = $arr[$j + 1];$arr[$j + 1] = $temp;}}
}// 输出排序后的数组
echo '<pre>';
print_r($arr);

选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。

选择排序的算法思路:

1) 假设第一个元素为最小元素,记下下标。

2) 寻找右侧剩余的元素,如果有更小的,重新记下最新的下标。

3) 如果有新的最小的,交换两个元素。

4) 往右重复以上步骤,直到元素本身是最后一个。

<?php
//数组排序算法 :选择排序
$arr = array(1, 3, 6, 2, 8, 5);
$len = count($arr);for ($i = 0; $i < $len; $i++) {$min = $i;for ($j = $i + 1; $j < $len; $j++) {if ($arr[$j] < $arr[$min]) {$min = $j;}}if ($min != $i) {$temp = $arr[$i];$arr[$i] = $arr[$min];$arr[$min] = $temp;}
}
echo '<pre>';
print_r($arr);

插入排序

插入排序(Insert sort),插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

插入排序的算法思路:

1) 设置监视哨r[0],将待插入纪录的值赋值给r[0];

2) 设置开始查找的位置j;

3) 在数组中进行搜索,搜索中将第j个纪录后移,直至r[0].key≥r[j].key为止;

4) 将r[0]插入r[j+1]的位置上。

1、 认定第一个元素已经排好序;

2、 取出第二个元素,作为待插入数据;

3、 与已经排好序的数组的最右侧元素开始进行比较

4、 如果后面的小于前面的:说明前面已经排好序的那个数组元素不在对的位置(向后移一个),然后让新的元素填充进去(继续向前比:高级)

5、 重复前面的步骤:直到当前元素插入到对位置;

6、 重复以上步骤,直到所有的数组元素都插入到对的位置。

<?php
//PHP数组排序 :插入排序
$arr = array(4, 2, 3, 5, 9, 8);
$len = count($arr);for ($i = 1; $i < $len; $i++) {$temp = $arr[$i];$positionCorrect = false; // 标记位置是否正确for ($j = $i - 1; $j >= 0; $j--) {if ($arr[$j] > $temp) {$arr[$j + 1] = $arr[$j];$arr[$j] = $temp;} else {$positionCorrect = true; // 标记位置正确break;}}if (!$positionCorrect) {$arr[$i] = $temp;}
}echo '<pre>';
print_r($arr);

快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。(递归)

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

快速排序的算法是:

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

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

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

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

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

<?php
//快速排序
$arr = [1,2,3,7,4,8,6,5];
function quick_sort($arr){//递归出口$len = count($arr);if($len <= 1) return $arr;//取出某个元素,然后将剩余的数组元素,分散到两个不同的数组中$left = $right = array();for ($i = 1;$i < $len;$i++){//第一个元素作为比较元素//比较:小的放在left中,大的放right中if($arr[$i] < $arr[0]){$left[] = $arr[$i];}else{$right[] = $arr[$i];}}//合并三个数组return array_merge($left,array($arr[0]),$right);
}echo '<pre>';
print_r(quick_sort($arr));

查找算法

查找算法含义

查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算。查找算法是指实现查找过程对应的代码结。就是中大型数组中去快速定位想要的元素。

顺序查找算法

顺序查找也称为线形查找,从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。

二分查找算法

二分查找要求线形表中的结点按关键字值升序或降序排列,用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

折半算法思路:

1、 计算数组长度;

2、 确定左右两边的指针位置;

3、 找到中间位置;

4、 匹配

5、 然后根据大小重定边界

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

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

相关文章

利用K8S Statefulset搭建Etcd集群 - PVC存储

概述 在测试过程中发现&#xff0c;直接使用本地存储&#xff0c;当节点机器损坏了&#xff0c;对应机器的etcd数据也丢失了&#xff0c;故而做了利用K8S PV&#xff0c;PVC以及NFS来存储数据的尝试&#xff0c;经过一番折腾&#xff0c;测试成功&#xff0c;博文记录&#xf…

银行监管报送系统介绍(五):金融统计数据大集中自动化报送系统——PBOC Report

人民银行金融统计数据大集中自动化报送系统&#xff08;简称PBOC Report&#xff09;&#xff0c;是基于现代计算机网络技术应用基础上&#xff0c;由人行总行设置金融统计数据服务器&#xff0c;建立的一个全国统一的金融统计数据库。 人行针对各银行存贷款、中间业务、网点人…

【几何】平面方程

文章目录 平面方程一般式截距式点法式法线式 平面方程 平面方程是用一个方程来表示平面&#xff0c;平面上的所有点代入方程&#xff0c;方程都成立。因为用法的不同&#xff0c;平面方程一般有四种表现形式。 一般式 设 n ⃗ ( A , B , C ) \vec n(A,B,C) n (A,B,C) 为平…

信号处理--基于FBCSP滤波方法的运动想象分类

目录 理论 工具 方法 代码获取 理论 通用空间模式 (CSP) 算法可以用来有效构建最佳空间滤波器区分&#xff0c;然后实现运动想象的数据中的脑电信号的区分。然而&#xff0c;空间滤波器性能的好坏主要取决于其工作频带。如果脑电信号没有经过滤波或者滤波的频带范围不合适…

Django 铺垫

【一】基础知识点 【1】web框架的本质 Web框架本质上可以看成是一个功能强大的socket服务端用户的浏览器可以看成是拥有可视化界面的socket客服端两种通过网络请求实现数据交互 【2】浏览器发送请求 &#xff08;1&#xff09;HTTP协议 HTTP协议是超文本传输协议&#xff…

【云开发笔记No.15】持续改进与反馈

一、引言 在产品研发过程中&#xff0c;反馈机制是确保项目顺利进行并最终达到预期目标的关键环节。它不仅能够及时发现和纠正开发过程中的问题&#xff0c;还能促进团队成员之间的有效沟通&#xff0c;提高开发效率。持续改进作为现代研发管理的重要理念&#xff0c;与反馈机…

RabbitMQ的事务机制

想要保证发送者一定能把消息发送给RabbitMQ&#xff0c;一种是通过Confirm机制&#xff0c;另一种就是通过事务机制。 RabbitMQ的事务机制&#xff0c;允许生产者将一组操作打包成一个原子事务单元&#xff0c;要么全部执行成功&#xff0c;要么全部失败。事务提供了一种确保消…

wireshark下载

一、官网下载 www.wireshark.org 二、各版本链接 链接&#xff1a;Index of /download/

FPGA使用XADC测量外部模拟输入电压

一、XADC简介 1.1、特性 Xilinx系列的FPGA中都包含了一个内置的XADC&#xff0c;我们可以通过这个XADC进行一些精度不高的外部模拟信号采样以及FPGA片内传感器信号采集。XADC的分辨率为12位&#xff0c;采样率为1MSPS。 1.2、结构框图 两片XADC&#xff0c;ADC A可用于片内…

SpringJPA 做分页条件查询

前言: 相信小伙伴们的项目很多都用到SpringJPA框架的吧,对于单表的增删改查利用jpa是很方便的,但是对于条件查询并且分页 是不是很多小伙伴不经常写到. 今天我整理了一下在这里分享一下. 话不多说直接上代码: Controller: RestController public class ProductInstanceContr…

12 React 组件通信 兄弟组件之间通信

12 React 组件通信 兄弟组件之间通信 在React中实现兄弟组件通信相对于父子组件通信来说稍微复杂一些&#xff0c;因为React本身是基于单向数据流的&#xff0c;兄弟组件之间并没有直接的通信途径。不过可以通过以下几种方式实现兄弟组件通信&#xff1a; 通过共同的父组件传递…

Apache HTTP服务器(Linux离线编译安装)

Apache HTTP服务器&#xff08;Linux离线编译安装&#xff09; Apache是普通服务器&#xff0c;本身只支持html即普通网页。可以通过插件支持PHP,还可以与Tomcat连通(单向Apache连接Tomcat,就是说通过Apache可以访问Tomcat资源。反之不然)。 Apache和Tomcat都可以做为独立的w…

8个常见的数据可视化错误以及如何避免它们

在当今以数据驱动为主导的世界里&#xff0c;清晰且具有洞察力的数据可视化至关重要。然而&#xff0c;在创建数据可视化时很容易犯错误&#xff0c;这可能导致对数据的错误解读。本文将探讨一些常见的糟糕数据可视化示例&#xff0c;并提供如何避免这些错误的建议。 本文总结了…

Javascript由浅到深

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…

蓝桥杯day11刷题日记

P8615 [蓝桥杯 2014 国 C] 拼接平方数 思路&#xff1a;先把数据范围内的平方数打上标记&#xff0c;然后就是遍历这个区间&#xff0c;转成字符串&#xff08;好拆数据&#xff09;&#xff0c;用substr拆开数据&#xff0c;再强转成整数类型&#xff0c;最后查看拆开的数据是…

【WPF应用13】WPF基本控件-DockPanel布局详解与示例

引言 WPF (Windows Presentation Foundation) 是微软 .NET 框架的一个组成部分&#xff0c;它用于构建桌面应用程序的用户界面。在 WPF 中&#xff0c;控件是构建用户界面的基本元素&#xff0c;而布局控件则负责安排其他控件的位置和大小。DockPanel 是 WPF 中的一个布局控件&…

如何使用PHP和RabbitMQ实现消息队列?

前言 今天我们来做个小试验&#xff0c;用PHP和RabbitMQ实现消息队列功能。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 如何使用docker部署php服务_php如何使用docker发布-CSDN博客 一、安装RabbitMQ 1、创建相关目录&#xff0c;执行如下命令。…

计算机网络⑦ —— 网络层协议

1. ARP协议 在传输⼀个 IP 数据报的时候&#xff0c;确定了源 IP 地址和⽬标 IP 地址后&#xff0c;就会通过主机路由表确定 IP 数据包下⼀跳。然⽽&#xff0c;⽹络层的下⼀层是数据链路层&#xff0c;所以我们还要知道下⼀跳的 MAC 地址。由于主机的路由表中可以找到下⼀跳的…

手撕算法-接雨水

描述 分析 i位置能积累的雨水量&#xff0c;等于其左右两边最大高度的最小值。为了能获取i位置左右两边的最大高度。使用动态规划。两个dp数组&#xff1a; leftMaxrightMax 其中 leftMax[i] 代表i位置左边的最大高度rightMax[i] 代表i位置右边的最大高度 初始状态&#x…

npm 包管理工具:常用命令详解与使用指南

npm常用命令的更详细解释和使用场景&#xff1a; npm init 详细说明&#xff1a;此命令用于初始化一个新的Node.js项目。它会创建一个package.json文件&#xff0c;其中包含项目的基本信息&#xff0c;如名称、版本、描述、入口点&#xff08;main file&#xff09;、测试命令、…