一、冒泡排序
```
$arr = array(1,4,2,9,7,5,8);
//想办法可以每次找出最大值得代码重复执行
for($i=0;$len=count($arr);$i<$len;$i++){
//将最大值放到最右边
for($j=0;$j<$len-1;$j++){
if($arr[$j]>$arr[$j+1]){
$tenp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $arr[$j]
}
}
}
```
![](https://img.kancloud.cn/b4/9f/b49fdb68230c2aacebf202a9a144d246_811x253.gif)
```
//优化冒泡算法,将不需要的比较去掉
$arr = array(1,4,2,9,7,5,8);
for($i=0;$len=count($arr);$i<$len;$i++){
for($j=0;$j<$len-1-$i;$j++){
if($arr[$j]>$arr[$j+1]){
$tenp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $arr[$j]
}
}
}
```
二、选择排序
```
$arr = array(1,4,2,9,7,5,8);
//确定要交换多少次,一次只能找到一个最小值,需要找数组长度对应的次数
for($i=0;$len = count($arr);$i<$len;$i++){
//假设当前第一个已经排好序
$min =$i;
//拿该最小的去比较剩余的其他
for($j=$i+1;$j<$len;$j++){
if($arr[$j]<$arr[$j+1]){
$min =$j;
}
}
if($min != $i){
$temp = $arr[$i];
$arr[$i] = $arr[$min];
$arr[$min] = $temp;
}
}
```
![](https://img.kancloud.cn/e5/65/e565d137ad9d76233f19c7f818374266_700x400.gif)
三、插入排序
```
$arr = array(1,4,2,9,7,5,8);
for($i=1;$len = count($arr);$i<$len;$i++){
//取出当前要插入的元素
$temp = $arr[$i];
//标记:默认说明当前要插入的数组的位置是对的
$change = false;
//让该数据与前面已经排好序的数组元素重复比较(挨个比较),直到位置(交换)
for($j = $i-1;$j>=0;$j--){
if($arr[$j] > $temp){
//当前要插入的元素比前面已经排好序的元素小,交换位置
$arr[$j+1] = $arr[$j];
//前面顺序的数组元素有不合适的位置,继续比较
$change = true;
}else{
//插入元素比前面的都大
break;
}
}
//判断是否需要交换位置
if($change){
$arr[$j+1] = $temp;
}
}
```
![](https://box.kancloud.cn/91b76e8e4dab9b0cad9a017d7dd431e2_811x505.jpg)
四、快速排序
```
$arr = array(1,4,2,9,7,5,8);
function quick_sort($arr){
//递归出口
$len = count($arr);
if($len < =1){
return $arr;
}
//取出某个元素,然后将剩余的数组元素分散到两个不同的数组中
$left = $right=array();
for($i=1;$i<$len;$i++){
//第一个元素作为比较元素
if($arr[$i] < $arr[0]){
$left[] = $arr[$i];
}else{
$rigth = $arr[$i];
}
}
//$left和$right数组元素没有排好序;递归点
$left = quick_sort($left);
$rigth = quick_sort($rigth );
//合并三个数组
return array_merge($left,(array)$arr[0],$right);
}
```
![](https://img.kancloud.cn/c5/b2/c5b2d7c5b9e7650e8e8d42c460bf075c_850x650.gif)
五、归并排序
```
$arr = array(1,4,2,9,7,5,8);
function merge_sort($arr){
$len = count($arr);
if($len <= 1){
return $arr;
}
//拆分
$middle = floor($len/2);
$left = array_slice($arr,0,$middle);
$right = array_slice($arr,$middle);
//递归点:$left和$right都没有排好序,而且可能是多个元素的数组
$left = merge_sort($left);
$right = merge_sort($right );
//假设左右两边都已经排好序,二路归并
$m = array();
while(count($left) && count($right)){
//只要$left和$right里面还有元素就进行循环
//取出每个数组的第一个元素,进行比较
$m[] = $left[0] < $right[0]?array_shift($left):array_shift($right);
}
//返回结果
return array_merge($m,$left,$right);
}
```
![](https://img.kancloud.cn/c5/b2/c5b2d7c5b9e7650e8e8d42c460bf075c_850x650.gif)