准备工作
<?php
$arr = [7, 1, 3, 2, 6, 5, 4, 0];
一、冒泡排序
function bubbleSort($arr)
{
$len = count($arr);
if ($len <= 1) {
return $arr;
}
for ($i = 1; $i < $len; ++$i) {
for ($j = 0; $j < $len - $i; ++$j) {
if ($arr[$j] > $arr[$j + 1]) {
$temp = $arr[$j + 1];
$arr[$j + 1] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}
- 比较n和n+1项,如果n项>n+1项,交换位置。
- 实际是依次找最大值。
- 第一层for循环控制找最大值的次数,长度-1次。
- 第二层for循环控制边界,$i代表末尾已经排序过了几个最大值。
二、选择排序
function selectSort($arr)
{
$len = count($arr);
for ($i = 0; $i < $len; ++$i) {
$k = $i;
for ($j = $i + 1; $j < $len; ++$j) {
if ($arr[$j] < $arr[$k]) {
$k = $j;
}
}
if ($k !== $i) {
$temp = $arr[$k];
$arr[$k] = $arr[$i];
$arr[$i] = $temp;
}
}
return $arr;
}
- 从0开始,向后找最小值,然后交换两个的位置。再从1开始找最小值,以此类推。
- 第一层for循环控制找最小值的次数,长度次,和冒泡不同处自行体会。
- 第二层for循环控制开始位置,$i前都是已经排序过了的。
三、插入排序
function insertSort($arr)
{
$len = count($arr);
if ($len <= 1) {
return $arr;
}
for ($i = 1; $i < $len; ++$i) {
$temp = $arr[$i];
for ($j = $i - 1; $j > -1; --$j) {
if ($temp < $arr[$j]) {
$arr[$j + 1] = $arr[$j];
$arr[$j] = $temp;
} else {
break;
}
}
}
return $arr;
}
- 当前项向前比较交换,直至不大于那一项,跳出循环。
- 第一层for循环控制代表多少项需要比较。
- 第二层for循环控制左边界。
- 有点像冒泡,但是只关注当前值,找到自己的位置后立即停止。
四、快速排序
function quickSort($arr)
{
$len = count($arr);
if ($len <= 1) {
return $arr;
}
$left = $right = [];
for ($i = 1; $i < $len; ++$i) {
if ($arr[$i] < $arr[0]) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
}
$left = quickSort($left);
$right = quickSort($right);
return array_merge($left, [$arr[0]], $right);
}
- 以数组第一项为标准,将其他项分拣到左右两个数组里,再递归操作。
- 递归递归递归递归。