冒泡排序
<?php
function bubbleSort($arr){
//n-1轮
for($i=1, $len=count($arr); $i<$len; $i++){
//n-i次比较
for($j=0; $j<$len-$i; $j++){
if($arr[$j] > $arr[$j+1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
// print_r($arr); //每一轮都会冒泡一个最大的到最后
}
return $arr;
}
选择排序
function selectSort($arr){
//n-1轮
for($i=0, $len=count($arr); $i<$len-1; $i++){
$minIdx = $i;
//从$i向后寻找最小index
for($j=$i+1; $j<$len; $j++){
if($arr[$j] < $arr[$minIdx]){
$minIdx = $j;
}
}
// echo $minIdx, PHP_EOL;
// 每轮最小index不同的话, 交换, 从而一直保持$i位置为每轮最小index
if($minIdx != $i){
$tmp = $arr[$i];
$arr[$i] = $arr[$minIdx];
$arr[$minIdx] = $tmp;
}
}
return $arr;
}
插入排序
function insertSort($arr){
//n-1轮
for($i=1, $len=count($arr); $i<$len; $i++){
$tmp = $arr[$i];
for($j=$i-1; $j>=0; $j--){
//要插入的数是tmp. 它会和$i前边的数比较, 并插入到合适位置. 因为前面的数已经有序, 所以, 如果要插入的数大, 那么不用交换了. 直接退出内层循环.
if($tmp < $arr[$j]){
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
}else{
break;
}
}
}
return $arr;
}
快速排序
function quickSort($arr){
if(count($arr) <= 1){
return $arr;
}
$middle = $arr[0];
$left = [];
$right = [];
for($i=1; $len=count($arr), $i<$len; $i++){
if($arr[$i] <= $middle){
$left[] = $arr[$i];
}else if($arr[$i] > $middle){
$right[] = $arr[$i];
}
}
$left = quickSort($left);
$right = quickSort($right);
return array_merge($left, array($middle), $right);
}