【PHP面试题】通俗易懂的两个面试必问的排序算法讲解:冒泡排序和快速排序
又到了金三银四找工作的时间,相信很多开发者都在找工作或者准备着找工作了。一般应对面试,我们无可厚非的去刷下面试题。对于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面试题】通俗易懂的两个面试必问的排序算法讲解:冒泡排序和快速排序的更多相关文章
- linux驱动工程面试必问知识点
linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...
- 互联网公司面试必问的Redis题目
Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用到.Redis相关的问题可以说是面试必问的,下面我从个人当面试官的经验,总结几个必须要掌握的知识点. 介绍:Redi ...
- 互联网公司面试必问的mysql题目(下)
这是mysql系列的下篇,上篇文章地址我附在文末. 什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构.一个非常恰 ...
- 互联网公司面试必问的mysql题目(上)
又到了招聘的旺季,被要求准备些社招.校招的题库.(如果你是应届生,尤其是东北的某大学,绝对福利哦) 介绍:MySQL是一个关系型数据库管理系统,目前属于 Oracle 旗下产品.虽然单机性能比不上or ...
- 面试必问:JVM类加载机制详细解析
前言 在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点. 类的加载和卸载 JVM是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是cla ...
- 一线大厂Java面试必问的2大类Tomcat调优
一.前言 最近整理了 Tomcat 调优这块,基本上面试必问,于是就花了点时间去搜集一下 Tomcat 调优都调了些什么,先记录一下调优手段,更多详细的原理和实现以后用到时候再来补充记录,下面就来介绍 ...
- 高级测试工程师面试必问面试基础整理——python基础(一)(首发公众号:子安之路)
现在深圳市场行情,高级测试工程师因为都需要对编程语言有较高的要求,但是大部分又没有python笔试机试题,所以面试必问python基础,这里我整理一下python基本概念,陆续收集到面试中python ...
- Java面试必问之Hashmap底层实现原理(JDK1.7)
1. 前言 Hashmap可以说是Java面试必问的,一般的面试题会问: Hashmap有哪些特性? Hashmap底层实现原理(get\put\resize) Hashmap怎么解决hash冲突? ...
- TCP的分分合合(面试必问)
TCP连接与断开 目录 TCP连接与断开 前言 握手 挥手 最后 前言 相信面试过的小伙伴对这个话题应该不陌生,算是面试必问了,三次握手,四次挥手,以及其中的一些衍生问题. TCP/IP(Transm ...
随机推荐
- because there was insufficient free space available after evicting expired cache entries
Tomcat运行的时候哗哗哗的报警告 版本是Tomcat 8.5.15 告警信息关键字如下 because there was insufficient free space available af ...
- Vue-项目之免费课和购物车实现
调整首页细节 固定头部 App.vue中代码 <style> body{ padding: 0; margin:0; margin-top: 80px; } </style> ...
- Centos7 下安装VMware tools
1:先在虚拟机点击安装VMware Tools 2:然后挂载 mount /dev/cdrom /mnt 3:进入/mnt,可以看到有 4:拷贝VMwareTools到其他 ...
- VS2010+WPF+LINQ for MySQL
学习wpf,连接数据库和linq for mysql 1.参考以前博文,恢复在 Vs2010+linQ for Mysql的环境. 2.建立 wpf工程,参照1,生成 datacontext.cs , ...
- Asp.net:上传文件超过了最大请求长度
错误消息:超过了最大请求长度 错误原因:asp.net默认最大上传文件大小为4M,运行超时时间为90S. 解决方案 1. 修改web.config文件可以改变这个默认值 ...
- 管理工具:SWOT、PDCA、6W2H、SMART、WBS、时间管理
01:SWOT分析法 Strengths:优势 Weaknesses:劣势 Opportunities:机会 Threats:威胁 意义:帮您清晰地把握全局,分析自己在资源方面的优势与劣势,把握环境提 ...
- div遮盖,弹出层
<html> <head> <title>LIGHTBOX EXAMPLE</title> <meta charset=& ...
- signapk
signapk工具可以实现对安卓ROM和安卓应用进行签名.在安卓DIY与安卓ROM制作中作用是非常大的.可以使用其对经过自己DIY修改美化后的应用进行签名或对制作好的安卓ROM卡刷包进行签名.让我们做 ...
- Azure VMSS (3) 修改VM Template并创建VMSS
<Windows Azure Platform 系列文章目录> 在开始本章内容之前,我们需要准备好Azure VM的镜像,具体可以参考:Azure VMSS (2) 对VM执行Genera ...
- CentOS 7安装WordPress
在开始本文前,我假定你已经安装好了nginx.php-fpm和mariaDB(或mysql).它们的安装过程可参考我以前的文章. 1. 安装EPEL(Extra Packages for Enterp ...