## 冒泡排序
```
//冒泡:依次对比相邻的值,符合条件(大于或小于)则交换位置。
function sort_maopao($array ){
$len = count($array);
for($i=0;$i<$len;$i++){
for($j=0;$j<$len-$i-1;$j++){
if( $array[$j] > $array[$j+1] ){
$temp = $array[$j];
$array[$j] = $array[$j+1];
$array[$j+1] = $temp;
}
}
}
return $array;
}
```
## 快速排序
```
//快速排序:取一个元素作为基准,将数组分成两部分,小在左,大在右,然后合并,递归调用。
function sort_fast($array){
if(count($array)<=1){
return $array;
}
$check = array_shift($array);
$left_array = $right_array = [];
foreach ($array as $v){
if($v<=$check){
$left_array [] = $v;
}else{
$right_array [] = $v;
}
}
$left_array = sort_fast($left_array);
$right_array = sort_fast($right_array);
return array_merge($left_array,[$check],$right_array);
}
```
## 插入排序
```
//插入排序:首选默认第一个值为已排序部分。 将已排序部分的下一个值b 依次和 已排序数组的每一个值a作比较,如果 b小于a则,b插入到a的前面。(后值和前面每一个值作比较)
function sort_insert($array){
$len = count($array);
for ($i=1;$i<$len;$i++){
for($j=0;$j<$len-1;$j++){
if($array[$j]<$array[$i]){
$temp = $array[$i];
$array[$i] = $array[$j];
$array[$j] = $temp;
}
}
}
return $array;
}
```
## 选择排序
```
//选择:依次选取数组中的值,将此值和数组中剩下的每一个值做比较,将最小的值放入到当前选取的值的位置上。
function sort_select($array){
$len = count($array);
for($i=0;$i<$len-1;$i++){ //末位值无须比较
$mix = $i; //当前值下标 , 默认为最小值
for ($j=$i+1;$j<$len;$j++){
if($array[$j]<$array[$mix]){
$mix = $j;
}
}
if($mix!=$i){ //当前值下标不是最小值,交换两个下标的值。
$temp = $array[$i];
$array[$i] = $array[$mix];
$array[$mix] = $temp;
}
}
return $array;
}
```
## 归并排序
```
//归并排序:
//将数组递归分成两部分,将两部分依次排序
function sort_merge($array){
$len = count($array);
if($len<2){
return $array;
}
$chunk = intval($len / 2);
$left = sort_merge( array_slice($array,0,$chunk) ) ;
$right = sort_merge( array_slice($array,$chunk)) ;
return _merge($left,$right);
}
function _merge($aArray,$bArray){
$cArray = [];
while (count($aArray) && count($bArray)){
$cArray[] = $aArray[0] <$bArray[0] ? array_shift($aArray) : array_shift($bArray);
}
return array_merge($cArray,$aArray,$bArray);
}
```
##总结:
https://www.cnblogs.com/mzhaox/p/11218297.html
| 算法 |总结 |
| --- | --- |
| 冒泡 |遍历每一个元素,每个元素和它后面的元素逐一对比,比较差异并交换位置。 |
| 快速 |取基准值,遍历元素,将小于 和大于基准值的元素分别放入到两个数组中,将两个数组分别递归调用,然后合并数组|
| 插入 | 首选默认第一个值为已排序部分。 将已排序部分的下一个值b 依次和 已排序数组的每一个值a作比较,如果 b小于a则,b插入到a的前面。(后值和前面每一个值作比较)|
| 选择 | 依次选取数组中的值,将此值和数组中剩下的每一个值做比较,将最小的值放入到当前选取的值的位置上。 |
| 归并 |将数组递归分成两部分,将两部分依次排序 |
## 算法复杂度
![](images/1176981-20200322160828471-490529190.png)
参考:https://www.jianshu.com/p/f4cca5ce055a
- 消息队列
- 为什么要用消息队列
- 各种消息队列产品的对比
- 消息队列的优缺点
- 如何保证消息队列的高可用
- 如何保证消息不丢失
- 如何保证消息不会重复消费?如何保证消息的幂等性?
- 如何保证消息消费的顺序性?
- 基于MQ的分布式事务实现
- Beanstalk
- PHP
- 函数
- 基础
- 基础函数题
- OOP思想及原则
- MVC生命周期
- PHP7.X新特性
- PHP8新特性
- PHP垃圾回收机制
- php-fpm相关
- 高级
- 设计模式
- 排序算法
- 正则
- OOP代码基础
- PHP运行原理
- zavl
- 网络协议new
- 一面
- TCP和UDP
- 常见状态码和代表的意义以及解决方式
- 网络分层和各层有啥协议
- TCP
- http
- 二面
- TCP2
- DNS
- Mysql
- 锁
- 索引
- 事务
- 高可用?高并发?集群?
- 其他
- 主从复制
- 主从复制数据延迟
- SQL的语⾔分类
- mysqlQuestions
- Redis
- redis-question
- redis为什么那么快
- redis的优缺点
- redis的数据类型和使用场景
- redis的数据持久化
- 过期策略和淘汰机制
- 缓存穿透、缓存击穿、缓存雪崩
- redis的事务
- redis的主从复制
- redis集群架构的理解
- redis的事件模型
- redis的数据类型、编码、数据结构
- Redis连接时的connect与pconnect的区别是什么?
- redis的分布式锁
- 缓存一致性问题
- redis变慢的原因
- 集群情况下,节点较少时数据分布不均匀怎么办?
- redis 和 memcached 的区别?
- 基本算法
- MysqlNew
- 索引new
- 事务new
- 锁new
- 日志new
- 主从复制new
- 树结构
- mysql其他问题
- 删除
- 主从配置
- 五种IO模型
- Kafka
- Nginx
- trait
- genergtor 生成器
- 如何实现手机扫码登录功能
- laravel框架的生命周期