「PHP」常用四种排序算法以及性能对比
myzbx 2025-07-02 23:18 5 浏览
作为一名合格的PHPer怎么能不接触到算法这个高大上的东西了,今天就来针对初学者来说一说最基础的4种排序算法:冒泡排序、选择排序、插入排序、快速排序(分区排序)。
冒牌排序
核心思想:比较相邻两个元素的大小,如果左边大于右边,则调换两个元素的位置;
缺点:需要将数组中的每一个元素都进行对比,耗时较长
$array = [5,10,3,4,2,8,7,9,11];
$length = count($array);
//第一层控制循环的次数,元素有多少个就需要循坏多少次
for ($i = 1; $i < $length; $i++) {
//第二层循环比较相邻元素的大小,调换位置
for ($j = 0; $j < $length - $i; $j++) {
if ($array[$j] > $array[$j + 1]) {
$tmp = $array[$j + 1]; //临时保存,替换两者位置
$array[$j + 1] = $array[$j];
$array[$j] = $tmp;
}
}
}
return $array;
选择排序
核心思想:取后一位元素与当前元素对比,然后将小的元素插入到最前位置
$array = [5,10,3,4,2,8,7,9,11];
$length = count($array);
//第一层控制循环的次数,元素有多少个就需要循坏多少次
for ($i = 0; $i < $length - 1; $i++) {
$p = $i; //假设当前元素是最小元素的下标;
//第二层循环从下一个元素开始比较
//注意这里的开始位置是从基准元素的下一个位置开始的
//可以认为前面的元素是已经排序完成了
for ($j = $i + 1; $j < $length; $j++) {
//找到更小的元素下标
if ($array[$p] > $array[$j]) {
$p = $j;
}
}
//如果最小元素不是之前假设的元素,则调换位置
if ($p != $i) {
$tmp = $array[$p];
$array[$p] = $array[$i];
$array[$i] = $tmp;
}
}
return $array;
插入排序
核心思想:每次循环中,从下一个元素开始比较,然后将最小的元素插入到数组的最前面(但是为了更好的性能,我们通常采用替换位置的方法来将最小元素位移到数组的前面)
$array = [5,10,3,4,2,8,7,9,11];
$length = count($array);
//第一层控制循环的次数,元素有多少个就需要循坏多少次
for ($i = 1; $i < $length; $i++) {
$tmp = $array[$i]; //记录当前基准元素
//从基准元素的下一个元素开始比较
for ($j = $i - 1; $j >= 0; $j--) {
//如果下一个元素比当前基准元素要小则调换位置
if ($tmp < $array[$j]) {
$array[$j + 1] = $array[$j];
$array[$j] = $tmp;
} else {
break;
}
}
}
return $array;
快速排序
核心思想:取任意元素为基准,然后二分递归一直执行,每次都是小的左边,大的右边。最后将结果合并
$array = [5,10,3,4,2,8,7,9,11];
//如果不是数组则终止执行
if (!is_array($array)) return false;
$length = count($array);
//如果数组元素小于2个则终止执行
if ($length <= 1) return $array;
$left = $right = [];
//任意取一个元素作为基准元素
//将小于该基准的元素存放进左边
//将大于该基准的元素存放进右边
for ($i = 1; $i < $length; $i++) {
if ($array[$i] > $array[0]) {
$right[] = $array[$i];
} else {
$left[] = $array[$i];
}
}
//递归执行
$left = quick_sort($left);
$right = quick_sort($right);
//将结果合并
return array_merge($left, [$array[0]], $right);
最后总结
经测试,四种方法中快速排序的性能最高。数组取10000个元素,然后分别执行消耗的时间如图所示
在实际开发中,能直接使用到这样代码的场景并不多,但是作为程序员缺必须掌握这种开发思想逻辑。如果只是完成了业务开发就万事大吉的话注定后面的路子会越来越难走的。
相关推荐
- 每日C语言-快速排序(c语言快速排序怎么排)
-
定义:快速排序是一种常见的排序算法,基于分治的思想。其基本思想是选择一个基准数,将待排序数组分为两个子数组,一个子数组中的所有数字都比基准数小,另一个子数组中的所有数字都比基准数大。然后对这两个子数组...
- 【每天学习一个EXCEL函数】SORT 函数(万能排序函数)
-
=SORT(数组[排序依据],[排序顺序],[按列])其中:排序顺序1是升序,-1是降序,不填时默认为1。按列FALSE为竖向排序,True为横向排序,不填时默认FALSE。第3和第4参数是可以...
- C语言排序方法——冒泡排序详解!你学会了吗?
-
冒泡排序法的基本思路为:每次将相邻的两个数比较,将小的调在前面。举个例子,如果有6个数:9,8,5,4,2,0。第一次先将最前面的两个数9和8对调。第二次将第2个数和第3个数对调(9和5)······...
- PHP排序算法:计数、选择、插入、归并、快速、冒泡、希尔、堆
-
1.冒泡排序算法//冒泡排序算法php//author:Hengda//$arr待排序数组//$modefalse正序,true倒序functionbubbleSort(&$arr,...
- 灵魂拷问:如何检查 Java 数组中是否包含某个值?
-
作者|沉默王二责编|Elle在逛programcreek的时候,我发现了一些专注细节但价值连城的主题。比如说:如何检查Java数组中是否包含某个值?像这类灵魂拷问的主题,非常值得深入地研...
- Java排序之冒泡排序(java冒泡排序选择排序)
-
今天来给大家介绍一下排序算法之冒泡排序jwt简介冒泡排序:(BubbleSort)是一种简单的交换排序。之所以叫做冒泡排序,因为我们可以把每个元素当成一个小气泡,根据气泡大小,一步一步移动到队伍的一...
- PHP 数组排序:使用心得、示例代码和问题解决笔记
-
PHP数组排序:使用心得、示例代码和问题解决笔记在PHP开发中,数组排序是一项常见的任务。它可以帮助我们对数组中的元素进行排序,以便更好地管理和处理数据。在本文中,我将分享一些关于PHP数组排序的使...
- 「PHP」常用四种排序算法以及性能对比
-
作为一名合格的PHPer怎么能不接触到算法这个高大上的东西了,今天就来针对初学者来说一说最基础的4种排序算法:冒泡排序、选择排序、插入排序、快速排序(分区排序)。冒牌排序核心思想:比较相邻两个元素的大...
- 在嵌入式用C实现一个数组随机排序
-
在某些应用场景中,可能需要将一个数组的元素重新随机排列,我们可以称之为洗牌算法。其原理并不复杂,就是需要遍历整个数组,如果数组有n个元素,每当遍历到第i个数组元素时(i为数组元素的索引),再从0...
- 查询函数Choose、Lookup、Hlookup、Vlookup应用技巧解读
-
Excel中的查找和引用函数主要用于查找工作表中的所需内容,还可以获得工作表中的单元格位置或表格大小等信息,如果将查找和引用函数配合其他的Excel函数使用,将会发挥更强大的功能。常用的查询表中的数...
- 等了它N年,SORT函终于来了,可以让Excel表格自动排序
-
今天我们来学习一个Excel中的新函数,SORT函数,它的作用是对某一个数据区域进行排序,之前是OFFICE365的专属函数,现在WPS也支持这个函数了,我觉得是时候跟大家讲解下它是的使用方法,这个函...
- js数组常用方法总结(js数组常用的方法及用法)
-
首先说明,本文没技术含量,都是js的知识,只是为以后查阅方便。另外我们开了一个免费的讲解web前端课程,有兴趣的朋友可以去看,详情地址:http://fe.qietu.com/forum.php1、创...
- Excel新公式,好用的SORT排序公式,1分钟学会!
-
最新版本的Excel,里面有一个SORT函数公式,是用来排序的,特别好用,1分钟学会1、Sort诞生背景在排序的时候,我们有一个痛点,举个例子,当我们统计数据时,会下表的任务完成率排序,降序排列其中的...
- [西门子PLC] SCL编程实例:1200/1500PLC不定长数组选择排序运用
-
前景介绍:01选择排序原理;选择排序算法首先从第1个位置开始对全部元素进行选择,选出全部元素中最小的给该位置,再对第2个位置进行选择,在剩余元素中选择最小的给该位置即可;以此类推,重复进行“最小元素”...
- 图解简单选择排序,超详细非常好理解
-
1.基本概念简单选择排序(SelectSort)真的是人如其名,一是它真的非常简单,二是它主要依靠选择和交换操作来进行排序。可以将简单选择排序实现为稳定的排序算法,也可以实现为不稳定的排序算法。我...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 选择器 (30)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)