最近面试总是问排序算法,所以总结一下PHP实现常见的四种排序算法:插入排序 快速排序 冒泡排序 选择排序
<?php
/**
PHP实现常见排序方法
以升序排列,从小到大
*/
class customsort{
/**
插入排序:从数组第二个元素开始,与前面元素比较,如果比前一个元素小则调换位置,否则继续下一个元素
*/
function insertsort($arr){
$len = count($arr);
if($len <= 1){
return $arr;
}
for($i=1;$i<$len;$i++){
//获取当前值
$val = $arr[$i];
//获取当前位置
$pos = $i;
while($pos > 0 && $arr[$pos - 1] > $val){
$arr[$pos] = $arr[$pos - 1];
$pos = $pos - 1;
}
$arr[$pos] = $val;
}
return $arr;
}
/**
快速排序:取数组中一个值为中间值,其它值与这个值进行比较,大于中间值的放在right数组,小于中间值的放在left数组,递归排序两个数组,连接两个数组和中间值
*/
function quitsort($arr){
$len = count($arr);
if($len <= 1){
return $arr;
}
$middle = $arr[0];
$left = array();
$right = array();
for($i=1;$i<$len;$i++){
if($middle < $arr[$i]){
$right[] = $arr[$i];
}else{
$left[] = $arr[$i];
}
}
//递归两个数组
$left = $this->quitsort($left);
$right = $this->quitsort($right);
return array_merge($left,array($middle),$right);
}
/**
冒泡排序:将相邻的两个值进行比较,如果前面的大则交换位置
*/
function bubblesort($arr){
$len = count($arr);
if($len <= 1){
return $arr;
}
for($i=0;$i<$len -1;$i++){
for($j=0;$j<$len - 1 - $i;$j++){
if($arr[$j] > $arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
return $arr;
}
/**
选择排序:在一组数字中,选出最小数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
*/
function selectsort($arr){
$len = count($arr);
if($len <= 1){
return $arr;
}
for($i=0;$i<$len - 1;$i++){
$p = $i;
for($j=$i+1;$j<$len;$j++){
if($arr[$p] > $arr[$j]){
$p = $j;
}
}
if($p != $i){
$temp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $temp;
}
}
return $arr;
}
}
$arr = [2,1,3,4,2,8,4,9];
$sort = new customsort();
$result = $sort->insertsort($arr);
$result1 = $sort->quitsort($arr);
$result2 = $sort->bubblesort($arr);
$result3 = $sort->selectsort($arr);
var_dump($result,$result1,$result2,$result3);
?>