又到了金三银四找工作的时间,相信很多开发者都在找工作或者准备着找工作了。一般应对面试,我们无可厚非的去刷下面试题。对于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. [ZZ] 麻省理工( MIT)大神解说数学体系

    麻省理工( MIT)大神解说数学体系 http://blog.sina.com.cn/s/blog_5ff4fb7b0102e3p6.html 其实每一门学科都应该在学习完成后,在脑子里面有一个体系, ...

  2. 格式化输出=========》format 和 %

    str.format()  实现格式化输出的功能 s1 = "i am {0},gae{1}".format("alex",18)   普通版,直接输入元祖  ...

  3. JDBC 中preparedStatement和Statement区别

    一.概念 PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement.PreparedStatement 和 CallableStatement三种方式 ...

  4. rabbitmq (二) 持久化

    默认情况下rabbitmq 是根据消费者多少依次投递,投递后就删除消息. 消息不会重复投递给不同的消费者. 消费者如果遇到长时间的任务,会执行完一个消息之后再执行下一个消息, 消费者持久化: 如果一个 ...

  5. C# 数字转换成大写

    /// <summary> /// 数字转大写 /// </summary> /// <param name="Num">数字</para ...

  6. 深度学习原理与框架-猫狗图像识别-卷积神经网络(代码) 1.cv2.resize(图片压缩) 2..get_shape()[1:4].num_elements(获得最后三维度之和) 3.saver.save(训练参数的保存) 4.tf.train.import_meta_graph(加载模型结构) 5.saver.restore(训练参数载入)

    1.cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR) 参数说明:image表示输入图片,image_size表示变 ...

  7. python中的re模块——正则表达式

    re模块:正则表达式 正则表达式:为匹配字符 import re #导入re模块 #re.findall('正则表达式','被匹配字符') re模块下findall用法 在正则表达式中: \w 表示匹 ...

  8. 剑指offer——合并两个排序的链表——对象、引用和赋值初接触

    题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然,我们需要合成后的链表满足单调不减规则. 先公布结果: /* public class ListNode { int val; List ...

  9. Android Studio--按钮跳转新页

    MainActivity.xml: <Button android:id="@+id/btnGo" android:layout_width="wrap_conte ...

  10. [phvia/firman] PHP多进程服务器模型中的惊群

    [ 典型场景 ] 典型的多进程服务器模型是这样的,主进程绑定ip,监听port,fork几个子进程,子进程安装信号处理器,随后轮询资源描述符检查是否可读可写: 子进程的轮询又涉及到 IO复用,acce ...