## 冒泡排序
```
//冒泡:依次對比相鄰的值,符合條件(大于或小于)則交換位置。
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的前面。(后值和前面每一個值作比較)|
| 選擇 | 依次選取數組中的值,將此值和數組中剩下的每一個值做比較,將最小的值放入到當前選取的值的位置上。 |
| 歸并 |將數組遞歸分成兩部分,將兩部分依次排序 |
## 算法復雜度

參考: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框架的生命周期