对于排序算法,相信学计算机的同学都不会陌生。今天我们就来复习下常见的两个排序,适合小规模数据的排序算法:冒泡(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. Python 数组和列表:创建、访问、添加和删除数组元素

    Python 没有内置支持数组,但可以使用 Python 列表来代替. 数组 本页将向您展示如何使用列表作为数组,但要在 Python 中使用数组,您需要导入一个库,比如 NumPy 库.数组用于在一 ...

  2. 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(2)

    1.问题描述: 开发服务端推送,客户端能收到离线推送,但是推送收到的通知只能从手机顶部下拉看到,无法收到一个顶部的弹框.请问是什么原因? 解决方案: 可能原因一: 消息提醒的方式与消息类别有关,比如: ...

  3. 【FAQ】关于分析服务错误获取所选日期前一天事件数据的解决方法

    开发者通过华为分析服务下载所需的事件数据,这些数据可以导入到开发者自有的分析系统中,用于构建自定义报告或生成受众群体的个性化分析等,从而帮助制定切实有效的营销活动.数据导出支持按照用户属性和导出事件作 ...

  4. HarmonyOS后台任务管理开发指南上线!

      为什么要使用后台任务?开发过程中如何选择合适的后台任务?后台任务申请时存在哪些约束与限制? 针对开发者使用后台任务中的疑问,我们上线了概念更明确.逻辑结构更清晰的后台任务开发指南,包含具体的使用场 ...

  5. dom4j 通用解析器,解析成List<Map<String,Object>>

    import java.io.InputStream; import java.util.Iterator; import java.util.LinkedHashMap; import java.u ...

  6. 云原生之在kubernetes集群下部署mysql应用

    一.Mysql介绍 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库.MySQL是一种开源的关系型数据库管理系统,可将数据保存在不同的表中,而不是将所有数据放在一个大的仓库内,从而 ...

  7. 使用C# 创建、填写、删除PDF表单域

    通常情况下,PDF文件是不可编辑的,但PDF表单提供了一些可编辑区域,允许用户填写和提交信息.PDF表单通常用于收集信息.反馈或进行在线申请,是许多行业中数据收集和交换的重要工具. PDF表单可以包含 ...

  8. win11右下角快捷面板打不开的处理方法

    win11右下角快捷面板打不开的处理方法 在搜索中查询计算机管理(因为没有将此电脑放出来,所以就用搜索了) 然后找到服务,找到windows推送通知系统服务,右键属性,将自动改为禁用,然后停止此服务, ...

  9. 面对大规模 K8s 集群,如何先于用户发现问题?

    简介: 怎样才能在复杂的大规模场景中,做到真正先于用户发现问题呢?下面我会带来我们在管理大规模 ASI 集群过程中对于快速发现问题的一些经验和实践,希望能对大家有所启发. 作者 | 彭南光(光南)来源 ...

  10. Apache Dubbo 3.0.0 正式发布 - 全面拥抱云原生

    简介: 一个新的里程碑! 一.背景 自从 Apache Dubbo 在 2011 年开源以来,在一众大规模互联网.IT公司的实践中积累了大量经验后,Dubbo 凭借对 Java 用户友好.功能丰富.治 ...