四种排序的时间复杂度均为O(n²);
//冒泡排序
/*
外层循环 循环数组长度 次
内层循环 相邻的数做比较 如果有必要 则交换位置
*/
function buSort($arr){
$count = count($arr); //计算数组的长度 6 - 1
for($j=0;$j<$count;$j++){
for($i=0;$i<$count-1 - $j;$i++){
if($arr[$i] > $arr[$i+1]){ //相邻做比较
//位置交换
$tmp = $arr[$i];
$arr[$i] = $arr[$i+1];
$arr[$i+1] = $tmp;
}
}
}
return $arr;
}
//选择排序
/*
for(){
假设第一个($i个)值为最小值
此值 和其他所有的值比较 找到真实最小值
交换位置
}
*/
function seSort($arr){
$count = count($arr); //计算数组的长度
for($j=0;$j<$count;$j++){
//假设第一个是最小的值
$mIndex = $j; //最小值的索引是0
for($i=$j+1;$i<$count;$i++){
if($arr[$mIndex] > $arr[$i]){
$mIndex = $i; //记录更小值的索引 key
}
}
if($mIndex != $j){//说明前面对比过程中 发现了比初始假设值更小的
//交换位置
$tmp = $arr[$j];
$arr[$j] = $arr[$mIndex];
$arr[$mIndex] = $tmp;
}
}
return $arr;
}
print_r(seSort($arr));
//插入排序
function insertSort($arr){
$count = count($arr); //数组的元素数量
for($i=1;$i<$count;$i++){
//和前面的数比较 有可能和前面所有的数都做比较
for($j=$i-1;$j>=0;$j--){ //下标为 $i-1 的数 是当前取出来的数的前面的数
if($arr[$j+1] < $arr[$j]){
//变量交换
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}else{
break;
}
}
}
return $arr;
}
print_r(insertSort($arr));
//快速排序
function quickSort($arr){
//判断长度 是否<=1
if(count($arr) <=1){
return $arr;
}
$count = count($arr);
//取第一值
$base = $arr[0];
echo $base . '<hr>';
$left = [];
$right = [];
for($i=1;$i<$count;$i++){
if($arr[$i] < $base){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}
//quickSort($left);
//quickSort($right);
return array_merge(quickSort($left) , [$base] , quickSort($right));
}
print_r(quickSort($arr));