对于排序算法,相信学计算机的同学都不会陌生。今天我们就来复习下常见的两个排序,适合小规模数据的排序算法:冒泡(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——冒泡、插入的更多相关文章

  1. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  2. Java 常用排序算法/程序员必须掌握的 8大排序算法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配 ...

  3. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  4. 常用排序算法java实现

    写在前面:纸上得来终觉浅.基本排序算法的思想,可能很多人都说的头头是到,但能说和能写出来,真的还是有很大区别的. 今天整理了一下各种常用排序算法,当然还不全,后面会继续补充.代码中可能有累赘或错误的地 ...

  5. Java常用排序算法及性能测试集合

    测试报告: Array length: 20000 bubbleSort : 573 ms bubbleSortAdvanced : 596 ms bubbleSortAdvanced2 : 583 ...

  6. c#实现常用排序算法

    让我们先看一看常用排序算法的效率对比 接着请看代码和注释~ using System; using System.Collections.Generic; using System.Linq; usi ...

  7. 转载部长一篇大作:常用排序算法之JavaScript实现

    转载部长一篇大作:常用排序算法之JavaScript实现 注:本文是转载实验室同门王部长的大作,找实习找工作在即,本文颇有用处!原文出处:http://www.cnblogs.com/ywang172 ...

  8. 面试中常用排序算法实现(Java)

    当我们进行数据处理的时候,往往需要对数据进行查找操作,一个有序的数据集往往能够在高效的查找算法下快速得到结果.所以排序的效率就会显的十分重要,本篇我们将着重的介绍几个常见的排序算法,涉及如下内容: 排 ...

  9. 我们一起来排序——使用Java语言优雅地实现常用排序算法

    破阵子·春景 燕子来时新社,梨花落后清明. 池上碧苔三四点,叶底黄鹂一两声.日长飞絮轻. 巧笑同桌伙伴,上学径里逢迎. 疑怪昨宵春梦好,元是今朝Offer拿.笑从双脸生. 排序算法--最基础的算法,互 ...

  10. Python实现常用排序算法

    Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...

随机推荐

  1. Docker 14 Docker Compose

    概述 使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build.docker run 等命令操作容器. 然而微服务架构的应用系统一般包含若干个微服务,每个微服务 ...

  2. vs报错:RC1004 unexpected end of file found

    如图,在编译代码时,出现报错:RC1004  unexpected end of file found 原因是,cpp最后要多一行才行,不然就会报这个错误 错误示例: int main() { ret ...

  3. react native 0.73 配置 react-native-fs

    安装react-native-fs npm npm install react-native-fs --save yarn yarn add react-native-fs 安卓配置 android/ ...

  4. 美丽的夕阳qsnctfwp

    题目附件 查看图片,放大左侧发现建筑物上 8 个字:龙腾公寓/福阳集团 根据文字在搜索引擎中查找,并由此确定城市 通过百度地图全景地图查看当地桥梁,并与照片比对 调整地图比例尺,记录桥名 根据提示qs ...

  5. Apollo在有赞的实践

    Apollo在有赞的实践 原创 有赞技术 有赞coder 2020-02-14 .. 作者:俞柯 & 张正 团队:有赞云 一. 背景和Apollo简介 在集中式开发时代,配置文件基本足够用了, ...

  6. mybatis generator生成mapper接口后的代理类,很方便使用。

    1.spring 配置: <bean id="superMapperProxy" class="com.qws.v1.daoImpl.MapperProxy&quo ...

  7. Vue3开源组件库

    最近收到的很多问题都是关于Vue3组件库的问题 今天就给大家推荐几个基于Vue3重构的开源组件库 目前状态都处于Beta阶段,建议大家抱着学习的心态入场,勿急于用到生产环境 Ant-design-vu ...

  8. 【ESP32 IDF】用RMT控制 WS2812 彩色灯带

    在上一篇中,老周用 .NET Nano Framework 给大伙伴们演示了 WS2812 灯带的控制,包括用 SPI 和 红外RMT 的方式.利用 RMT 是一个很机灵的方案,不过,可能很多大伙伴对 ...

  9. 登录chatgpt的时候出现429的解决方法,亲测有效

    登录chatgpt的时候出现429的解决方法 PS:在2023年3月14日晚还是可以用的,亲测有效 登录chatgpt的时候出现429的解决方法 很多时候在国内用代理进入chatgpt的时候会出现42 ...

  10. 第11課-Channel Study For Create Custom Restful Service

    这节课我们一起学习利用Mirth Connect的HTTP Listener源通道与JavaScript Writer目的通道搭建自定义Restful风格webapi服务. 1.新建名为'Custom ...