php 实现四大基础算法
冒泡
- 时间复杂度O(N*N)
- 具备稳定性
- 思路
- 外层循环控制轮数
- 内存循环 比较大小 比前一个数字大 则交换
点击查看代码
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
for ($k = 0; $k < $len - $i; $k++) {
if ($arr[$k] > $arr[$k + 1]) {
list($arr[$k], $arr[$k + 1]) = array($arr[$k + 1], $arr[$k]);
}
}
}
插入排序
- 时间复杂度 O(N*N)
- 具备稳定性
- 思路:
- 每次假设每次前一个已经时序
- 外层控制轮数数 去除第一个
- 内存在已经有序的序列中 比前一个小则交换
点击查看代码
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
$tmp = $arr[$i];
for ($k = $i - 1; $k >= 0; $k--) {
if ($tmp < $arr[$k]) {
$arr[$k + 1] = $arr[$k];
$arr[$k] = $tmp;
} else {
break;
}
}
}
选择排序
- 时间复杂度 O(N*N)
- 不具备稳定性 第一个选择最大值已经破坏了稳定性
- 思路:
- 每次选择一个最小数字 和前一个交换
- 外层控制轮数
- 内存每次去除一个最小数字 交换
点击查看代码
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
$p = $i;
for ($k = $i + 1; $k < $len; $k++) {
if ($arr[$p] > $arr[$k]) {
$p = $k;
}
}
if ($p != $i) {
list($arr[$i], $arr[$p]) = array($arr[$p], $arr[$i]);
}
}
随机快排
- 时间复杂度 O(N * logN)
- 不具备稳定性
- 思路
- 每次 0 1 序列 左边小于基准值 右边大于基准值
- 分区思想 然后左边有序 + 中间 + 右边有序
点击查看代码
$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];
}
}
quick_sort($left);
quick_sort($right);
return array_merge($left, [$arr[0]], $right);
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16844998.html