选择排序
<?php
// 选择排序 每次循环都会从剩余的元素中找到一个最大(小)的元素放在 对应的位置
function SelectSort(array $arr) {
$len = count($arr);
if (1 >= $len) {
return $arr;
}
for ($i = 0; $i < $len - 1; $i++) { // 外层循环定位
for ($j = $i + 1; $j < $len; $j++) { // 内层循环找元素
if ($arr[$i] > $arr[$j]) { // 符合条件就进行对应位置的交换
$tmp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}
var_dump(SelectSort([3, 12, 42, 1, 24, 5, 346, 7]));
插入排序
<?php
// 插入排序 一开始认为第一个元素是已经排好序的 然后从第二个元素开始 依次向前搜索 找到符合条件的元素和位置插入
function InsertSort(array $arr) {
$len = count($arr);
if (1 >= $len) {
return $arr;
}
for($i = 1; $i < $len; $i++) {
$temp = $arr[$i];
$j = $i - 1;
while($j >= 0 && $arr[$j] > $temp) {
$arr[$j+1] = $arr[$j];
$j--;
}
$arr[$j+1] = $temp;
}
return $arr;
}
var_dump(InsertSort([3, 12, 42, 1, 24, 5, 346, 7]));
冒泡算法
<?php
// 冒泡排序 每次循环都会产生一个当次循环最大(小)的数据
function MaopaoSort(array $arr) {
$len = count($arr);
if (1 >= $len) {
return $arr;
}
for ($i = 0; $i < $len; $i++) {
$run = false; // 设置一个标识,若在某一次内层循环中没有执行元素交换就证明整个排序已经完成,退出循环,后续的就不用在浪费cpu了
for ($j = 0; $j < $len - $i - 1; $j++) {
if ($arr[$j] < $arr[$j + 1]) {
$run = true;
$tmp = $arr[$j];
$arr[$j] = $arr[$j + 1];
$arr[$j + 1] = $tmp;
}
}
if (!$run) {
break;
}
}
return $arr;
}
var_dump(MaopaoSort([4, 21, 41, 2, 53, 1, 213, 31, 21, 423]));
快速排序
<?php
// 快速排序
function QuickSort(array $arr) {
$len = count($arr);
if (1 >= $len) {
return $arr;
}
$mid = $arr[0];
$left = $right = [];
for ($i = 1; $i < $len; $i++) {
if ($arr[$i] >= $mid) {
$right[] = $arr[$i];
} else {
$left[] = $arr[$i];
}
}
$left = QuickSort($left);
$right = QuickSort($right);
return array_merge($left, [$mid], $right);
}
var_dump(QuickSort([4, 21, 41, 2, 53, 1, 213, 31, 21, 423]));