PHP常用排序算法01——冒泡、插入
对于排序算法,相信学计算机的同学都不会陌生。今天我们就来复习下常见的两个排序,适合小规模数据的排序算法:冒泡(bubbleSort)和插入(insertionSort)。
PS:对排序等算法还不太了解的同学,可以去看下这个链接哦,十大经典排序算法(动图演示),一些基础定义和动图演示做的很好啦,代码是用JavaScript实现的。我这个呢是PHP版本,而且有些小细节优化会注明在代码段上,都是经过本人实际操作的,下面开始正文。
1、冒泡排序
(1)概念:
①依次比较相邻的两个数据,大小关系不对,就互换位置;
②每一轮比较冒出一个数。
(2)优化:当某次冒泡操作已经没有数据交换时,说明已经达到完全有序,不用再继续执行后续的冒泡操作。
(3)代码实现如下:
public static function bubbleSort(){
$array = [4,5,6,3,2,1];
$count = count($array);
//外层循环控制冒泡出去的个数,冒一个需要一个个去比较一轮
for($i=0;$i<$count;$i++){
$flag = false; //提前退出冒泡循环的标志位。当不需要再比较的时候,就会停止循环了。该处是优化代码
for($j=0;$j<$count-$i-1;$j++){ //内层循环控制每一轮需要比较的次数。比如,冒出一个了,每轮就少比较一个数。冒出两个了,每轮就少比较两个数
if($array[$j] > $array[$j+1]){
$temp = $array[$j];
$array[$j] = $array[$j+1];
$array[$j+1] = $temp;
$flag = true; //内层循环但凡比较了一次,$flag = true 就会执行,下一轮外层就会继续循环。该处是优化代码
}
}
if(!$flag){break;}//内层循环但凡比较了一次,$flag = true 就会执行,下一轮外层就会继续循环。该处是优化代码
}
return $array;
}
2、插入排序
(1)概念:
①将数组中的数据分为两个区间,已排序区间和未排序区间。
②初始已排序区间只有一个元素,就是数组的第一个元素。
③取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。
(2)代码实现如下:
public static function insertionSort()
{
$array = [4,5,6,1,3,2];
$count = count($array); //分为已排序和未排序的。未排序的往已排序好的找准位置插入
for($i=1;$i < $count;$i++){ //从第二个元素开始(未排序)往已排序的那块插入
$value = $array[$i]; //未排序的,要排序的值
$j = $i - 1; //未排序的前一个,即已排序的第一个下标
//查找插入的位置
for($j;$j >= 0;$j--){ //从已排序的第一个下标开始,一个个遍历对比未排序的
if($array[$j] > $value){
$array[$j+1] = $array[$j]; //大小关系没按顺序排时,对比依次往后挪一个下标空间。腾出空间让新元素插入
}else{ //因为左边是已经排好序的了,所以位置对了就可以跳出循环了
break;
}
}
$array[$j+1] = $value; //插入数据
}
return $array;
}
3、冒泡和插入的比较
(1)冒泡排序和插入排序的时间复杂度都是 O(n2),都是原地排序算法(排序时不需要额外的存储空间),都是稳定的排序算法,空间复杂度均为O(1),比较适用于小规模的数据排序(至于大规模的数据排序,那就要用到快速排序、归并排序、堆排序之类的啦);
(2)但插入排序更受欢迎,因为从代码实现上来看,冒泡排序的数据交换要比插入排序的数据移动要复杂。如下图所示,很明显冒泡交换移动操作更多,更耗时。

图一: 冒泡数据交换

图二: 插入数据交换
PHP常用排序算法01——冒泡、插入的更多相关文章
- Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法
Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...
- Java 常用排序算法/程序员必须掌握的 8大排序算法
Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...
- 常用排序算法的python实现和性能分析
常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...
- 常用排序算法java实现
写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...
- Java常用排序算法及性能测试集合
测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...
- c#实现常用排序算法
让我们先看一看常用排序算法的效率对比 接着请看代码和注释~ using System; using System.Collections.Generic; using System.Linq; usi ...
- 转载部长一篇大作:常用排序算法之JavaScript实现
转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...
- 面试中常用排序算法实现(Java)
当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果.所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容: 排 ...
- 我们一起来排序——使用Java语言优雅地实现常用排序算法
破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...
- Python实现常用排序算法
Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...
随机推荐
- Matplotlib绘图设置---图形颜色和风格调整
绘图函数 plt.plot()函数可以通过相应的参数设置绘图风格. plt.plot(*args, scalex=True, scaley=True, data=None, **kwargs) Doc ...
- ssm 创建bean的三种方式和spring依赖注入的三种方式
<!--创建bean的第一种方式:使用默认无参构造函数 在默认情况下: 它会根据默认无参构造函数来创建类对象.如果 bean 中没有默认无参构造函数,将会创建失败--> <bean ...
- openGauss/MogDB数据库安装部署之xlog目录设置
openGauss/MogDB 数据库安装部署之 xlog 目录设置 本文出处:https://www.modb.pro/db/176915 关于 xlog xlog 文件是一个记录事务日志的文件,它 ...
- github仓库开始启用Token认证,用户名密码模式将在2021年8月停止使用
提交代码到github原本使用github的登录账号和密码即可.现在github出于安全的考虑,将在2021年8月停止使用账号和密码的方式访问github仓库,改为token认证的方式. 创建步骤 点 ...
- go语言结构体使用小结
转载请注明出处: 在Go语言中,结构体(struct)是一种复合数据类型,它允许你将多个不同类型的字段组合成一个单一的类型.结构体为数据的封装和抽象提供了便利,使得数据组织更加清晰和易于管理. 结构体 ...
- 日志分析qsnctfwp
使用工具:http Logs Viewer 使用 http Logs Viewer 载入 access.log 按照 Status 排序 其中大量 Status 为404的日志不难推断出,这是在进行目 ...
- VulnHub-ical打靶记录
这绝对是最简单的一个题目了. 目标发现 netdiscover -r 192.168.0.10/24 根据靶场和本地系统的网段进行扫描. 信息收集 nmap -sV -Pn -sT -sC -A 19 ...
- numpy函数向量化,np.vectorize
import numpy as np import time def myfunc(a, b): if a>b: return a-b else: return a+b vfunc = np.v ...
- 树上点差分的经典应用 LuoguP3258松鼠的新家
树上点差分的核心就是如何避免重复,即正确的运用差分数组 例如a,b点路径上点权值加1,则把a,b路径找到,并找到其LCA,此时可以把a到根,b到根这两条路径看出两条链,把每条链看出我们熟悉的 顺序差分 ...
- 第一次blog
前言:我在大一上学期学习了c语言,然后在下学期学习了第二门语言java,因为之前c语言学的挺一般的,然后在这学期学习java感觉还是挺不简单的,要自学很多东西,在这段时间里,我学习了JAVA的基本语法 ...