又到了金三银四找工作的时间,相信很多开发者都在找工作或者准备着找工作了。一般应对面试,我们无可厚非的去刷下面试题。对于PHPer来说,除了要熟悉自己所做的项目,还有懂的基本的算法。下面来分享下PHP面试中常会问到的算法:冒泡排序和快速排序

冒泡排序:一一对比排序

基本思想:

重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。

图解:

1.第一次:拿着数组的第一个元素,分别从第二个元素开始比较,如果前面的元素比后面的元素大,则交换两个元素,得到较大的这个值,继续向后比较,直到数组元素的最后,实现一次冒泡(冒泡一次,就得到当前“剩余”数组的最大值,并且放到数组的“最后面”)

2.第二次开始,还是从第一个元素开始比较,但是只比较到数组长度要-1位置,并且每次的比较次数都依次-1

3.后面重复比较,直到最后没有需要一堆数字需要比较

代码:

 
          $arr = array(3,2,6,0,1,4,7);
          //因为排序需要每次将一个元素与数组的其他元素进行比较,所以需要两层循环来控制
          //外层循环控制冒泡次数
         //内存循环比较每次的大小,得到每次的最大值(泡)

          for($i = 0,$length = count($arr);$i < $length;$i++){

                   //内存循环
                   for($j = 0;$j < ($length - $i - 1);$j++){
                          //拿着j变量所对应的数组元素,与后面的元素进行比较
                          if($arr[$j] > $arr[$j + 1]){
                                   //交换位置
                                   $temp              = $arr[$j];
                                   $arr[$j]           = $arr[$j+1];
                                   $arr[$j+1]         = $temp;
                          }
                  }
         }
 

总结:

冒泡排序最好的时间复杂度是O(n),虽然说它不是最优的算法,但是这是我们经常接触到的,面试也会给问到,所以我们一定要懂的基本原理,能理解到,能写的出来

快速排序:用空间换时间

基本思想:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

图解:

找到当前数组中的任意一个元素,作为标准,新建两个空数组,遍历整个数组元素,遍历到的元素比当前元素要小,那么放到左边的数组;如果要大,放到另外一个数组中

递归思路

1.递归点:如果两个数组的元素大于1,就需要再进行分解

2.递归出口:数组元素变成1的时候

代码:

        
 
  //待排序数组
          $arr = array(5,3,8,2,6,4,7);
          //函数实现快速排序
          function quick_sort($arr){
                   //判断参数是否是一个数组
                   if(!is_array($arr)) return false;

                   //递归出口:数组长度为1就直接返回数组
                   $length = count($arr);
                  if($length <= 1) return $arr;

                  //数组元素有多个
                  $left = $right = array();
                  //使用for循环进行遍历,把第一个元素当做比较的对象
                  for($i = 1;$i < $length;$i++){
                          //判断当前元素值的大小
                          if($arr[$i] < $arr[0]){
                                   //当前元素小于标准元素,放到左边数组
                                   $left[] = $arr[$i];
                          }else{
                                   $right[] = $arr[$i];
                          }
                  }
                  //递归调用
                  $left = quick_sort($left);
                  $right = quick_sort($right);

                  //将所有的结果合并
                  return array_merge($left,array($arr[0]),$right);
         }
 

总结:

快速排序在一般的排序的方式中最快的排序方式,以递归为基础,使用空间换时间。在一般的面试中会给问到,要能知道基础原理。

【PHP面试题】通俗易懂的两个面试必问的排序算法讲解:冒泡排序和快速排序的更多相关文章

  1. linux驱动工程面试必问知识点

    linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...

  2. 互联网公司面试必问的Redis题目

    Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用到.Redis相关的问题可以说是面试必问的,下面我从个人当面试官的经验,总结几个必须要掌握的知识点. 介绍:Redi ...

  3. 互联网公司面试必问的mysql题目(下)

    这是mysql系列的下篇,上篇文章地址我附在文末. 什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构.一个非常恰 ...

  4. 互联网公司面试必问的mysql题目(上)

    又到了招聘的旺季,被要求准备些社招.校招的题库.(如果你是应届生,尤其是东北的某大学,绝对福利哦) 介绍:MySQL是一个关系型数据库管理系统,目前属于 Oracle 旗下产品.虽然单机性能比不上or ...

  5. 面试必问:JVM类加载机制详细解析

    前言 在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点. 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是cla ...

  6. 一线大厂Java面试必问的2大类Tomcat调优

    一.前言 最近整理了 Tomcat 调优这块,基本上面试必问,于是就花了点时间去搜集一下 Tomcat 调优都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录,下面就来介绍 ...

  7. 高级测试工程师面试必问面试基础整理——python基础(一)(首发公众号:子安之路)

    现在深圳市场行情,高级测试工程师因为都需要对编程语言有较高的要求,但是大部分又没有python笔试机试题,所以面试必问python基础,这里我整理一下python基本概念,陆续收集到面试中python ...

  8. Java面试必问之Hashmap底层实现原理(JDK1.7)

    1. 前言 Hashmap可以说是Java面试必问的,一般的面试题会问: Hashmap有哪些特性? Hashmap底层实现原理(get\put\resize) Hashmap怎么解决hash冲突? ...

  9. TCP的分分合合(面试必问)

    TCP连接与断开 目录 TCP连接与断开 前言 握手 挥手 最后 前言 相信面试过的小伙伴对这个话题应该不陌生,算是面试必问了,三次握手,四次挥手,以及其中的一些衍生问题. TCP/IP(Transm ...

随机推荐

  1. Web前端入门教程之浏览器兼容问题及解决方法

    JavaScript 被称为JS,是作为浏览器的内置脚本语言,为我们提供操控浏览器的能力,可以让网页呈现出各种特殊效果,为用户提供友好的互动体验.JS是Web前端入门教程中的重点和难点,而浏览器兼容性 ...

  2. QQ群成员发言次数统计(正则表达式版)

    1.先将QQ群的消息记录以.txt文件格式导出来,保存路径及名称自己定义(在本文我导出到Y盘,命名为test.txt) 2.程序如下: data statistics1; if _n_=1 then ...

  3. 虚拟机网络连接NAT模式,本地用Xshell连接

    当虚拟机centos6网络连接使用NAT模式时,因为共用宿主机ip所以当使用Xshell时直接填写虚拟机的ip地址和22端口是无法连接虚拟机的. 这样就需要配置端口映射关系! 1. 打开虚拟网络编辑器 ...

  4. dns缓存刷新时间是多久?dns本地缓存时间介绍

    原文: http://www.winwin7.com/JC/4742.html dns缓存刷新时间是多久?一般来说,我们只知道DNS解析是互联网绝大多数应用的实际寻址方式,在我们打开某站点,DNS返回 ...

  5. gogs 源码阅读笔记 001

    gogs 源码阅读笔记 001 gogs项目相当不错,本笔记实际是基于gogs fork版本 git-122a66f. gitea (gitea版本由来)[https://blog.gitea.io/ ...

  6. VIVADO 入门之仿真与逻辑分析仪使用

    多路分频器设计 在第七节的学习中,笔者带大家通过一个入门必学的流水灯实验实现,快速掌握了VIVADO基于FPGA开发板的基本流程.考虑到很多初学者并没有掌握好Vivado 下FPGA的开发流程,本章开 ...

  7. 【Linux】【Jenkins】配置过程中,立即构建时,maven找不到的问题解决方案

    在Linux环境下配置Jenkins执行时,发现不能执行Maven,这个比较搞了. A Maven installation needs to be available for this projec ...

  8. jdk 8 日期处理。

    ZoneId id = ZoneId.systemDefault(); LocalDateTime dateTime = LocalDateTime.now(id); System.out.print ...

  9. Rocket MQ 1 - 用

    参考 http://www.iocoder.cn/categories/RocketMQ/ ; https://www.jianshu.com/nb/16219849 首先上启动方法,分别启动name ...

  10. win10 下安装 neo4j(转)

    1.neo4j介绍 neo4j是基于Java语言编写图形数据库.图是一组节点和连接这些节点的关系.图形数据库也被称为图形数据库管理系统或GDBMS.详细介绍可看Neo4j 教程 2.安装Java jd ...