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实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...
随机推荐
- Unity中国、Cocos为OpenHarmony游戏生态插上腾飞的翅膀
2023年是OpenHarmony游戏生态百花齐放的一年!为了扩展OpenHarmony游戏生态,OpenHarmony在基金会成立了游戏SIG小组,游戏SIG小组联合cocos,从cocos2d ...
- 【开源三方库】bignumber.js:一个大数数学库
OpenHarmony(OpenAtom OpenHarmony简称"OpenHarmony")三方库,是经过验证可在OpenHarmony系统上可重复使用的软件组件,可帮助开发者 ...
- Linux之隔离技术
前言 Linux的内核有两大特性Namespace和CGroup,这两种特性可以在Linux主机上实现主机名.用户.网络等全局资源的隔离,也是实现网络虚拟化.容器技术的基础. 命名空间 Linux N ...
- mysql 必知必会整理—数据插入和更新还有删除[十]
前言 简单整理数据插入更新还有删除. 正文 插入: INSERT INTO customers( customers.cust_address, customers.cust_city, custom ...
- 一个简单的开源消息中间件 FolkMQ v1.4.2 发布
功能简表 角色 功能 生产者(客户端) 发布消息.定时消息(或叫延时).顺序消息.可过期消息.事务消息.支持 Qos0.Qos1 消费者(客户端) 订阅.取消订阅.消费-ACK(自动.手动) 服务端 ...
- 《Effective C#》系列之(四)——最小化内存泄露和资源占用
一.内存泄露 在<Effective C#>这本书中,最小化资源泄漏是其中一章的内容.以下是该章节的一些核心建议,以及使用C#代码示例说明: 及时释放非托管资源:在使用非托管资源时,需要手 ...
- css添加属性,让浏览器检查无法选中元素
1.表现 浏览器直接选中元素的时候,仅能直接选中整个body,想要找到具体元素,需要自己手动寻找,没太大实际作用,仅仅让不懂的人不能简简单单的直接定位元素然后修改里面的内容 pointer-event ...
- 力扣561(java&python)-数组拆分(简单)
题目: 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, ...
- 21克:仅需3天,我们就用Quick BI搭建起数据驾驶舱
简介:数智化并不仅仅是大型企业才需要去思考的课题,而是摆在所有企业面前的一个可选项.借助Quick BI搭建的数据分析体系,21克实现了销售.财务.供应链等多部门业务的数据化支撑,从一份份本地化的E ...
- 干货|一文读懂阿里云数据库Autoscaling是如何工作的
简介: 阿里云数据库实现了其特有的Autosaling能力,该能力由数据库内核.管控及DAS(数据库自治服务)团队共同构建,内核及管控团队提供了数据库Autoscaling的基础能力,DAS则负责性能 ...