快速排序
快速排序的基本思想是选择一个基准元素,将数组分割成两个子数组,小于基准的元素放在左边,大于基准的元素放在右边,然后递归地对子数组进行排序。
function qsort($array){
$length=count($array);
if($length <= 1){
return $array;
}
$index = $array[0];//对比值
$left = $right = [];
for($i=1;$i<$length;$i++){
if($array[$i]<$index){
$left[]=$array[$i];//接收小于对比值的数
}else{
$right[]=$array[$i];//接收大于对比值的数
}
}
// 只能用for循环,不能用foreach;
// foreach($array as $v){
// if($v < $index){
// $left[] = $v;
// } else($v>$index) {//死循环
// } elseif($v>$index) {//重复数字只出现一次
// $right[] = $v;
// }
// }
//递归与合并结果数组
return array_merge(qsort($left), [$index], qsort($right));
}
$array = [1, 4, 1, 5, 3];
print_r(qsort($array));
冒泡排序
重复地遍历待排序的元素,比较每对相邻的元素,如果顺序错误就将它们交换。这个过程持续进行直到没有需要交换的元素,即数组已经有序。
$array = [1, 4, 2, 5, 3];
$length=count($array);
for($i=0;$i<$length;$i++){
for($j=0;$j<$length-$i-1;$j++){//$length-$i-1必须减一,否则会多一个null
if($array[$j]>$array[$j+1]){
$tmp=$array[$j];
$array[$j]=$array[$j+1];
$array[$j+1]=$tmp;
}
}
}
var_dump($array);
插入排序
插入排序的时间复杂度为 O(n^2),但对于小型数据集或已经基本有序的数据集,插入排序可能是一种较好的选择。
function isort($array){
for($i=1;$i<count($array);$i++){
$current=$array[$i];
$j=$i-1;
while($j>=0 && $array[$j]>$current){
$array[$j+1]=$array[$j];
$j--;
}
$array[$j + 1] = $current;
}
return $array;
}
$array = [64, 34, 25, 12, 22, 11, 90];
$sortedArray = isort($array);
print_r($sortedArray);
选择排序
选择排序的时间复杂度为 O(n^2),不适用于大型数据集,但由于其简单性,对于小型数据集可能是一种可行的选择。
function isort($array){
$length=count($array);
for($i=0;$i<$length-1;$i++){
$min=$i;
for($j=$i+1;$j<$length;$j++){
if($array[$min]>$array[$j]){
$min=$j;
}
}
$temp=$array[$i];
$array[$i]=$array[$min];
$array[$min]=$temp;
}
return $array;
}
$array = [64, 34, 25, 12, 22, 11, 90];
$sortedArray = isort($array);
print_r($sortedArray);