php练习算法1000题
1.冒泡排序
--索引数组
---控制循环轮数
----控制每轮,冒出一个数
-----比较大小,互相替换位置
代码:
<?php
$arr = [2, 66, 43, 54, 62, 21, 66, 66, 32, 78, 36, 76, 39, 1];
function BubbleSort($arr) {
// 控制循环轮数
$len = count($arr);
for ($i = 1; $i < $len; $i++) {
// 控制每轮,冒出一个数
for ($k = 0; $k < $len - $i; $k++) {
// 比较大小,替换位置
if ($arr[$k] > $arr[$k + 1]) {
$tmp = $arr[$k + 1];
$arr[$k + 1] = $arr[$k];
$arr[$k] = $tmp;
}
}
}
return $arr;
}
var_dump(implode(',',BubbleSort($arr)));
结果如下:
2.选择排序
--索引数组
---控制循环轮数
----控制每轮,把所有数跟前面数对比
-----比较大小,设置位置
------若不是原位置则替换
代码:
<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39, 2];
//选择排序
function selectSort($arr){
// 控制循环轮数
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
$p = $i;
// 控制每轮,把所有数跟后面数对比
for ($k = $i + 1; $k < $len; $k++) {
$p = ($arr[$p] <= $arr[$k]) ? $p : $k;
}
// 若不是原位置则替换
if ($p != $i) {
$tmp = $arr[$i];
$arr[$i] = $arr[$p];
$arr[$p] = $tmp;
}
}
return $arr;
}
var_dump(implode(',',selectSort($arr)));
结果如下:
3.插入排序
--索引数组
---拿出的多少元素值做比较
----内层控制前面元素比较(由后到前)
-----比较大小,互相替换位置
------因前已排序好,若一个不符合,则完成循环
代码:
<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39,2];
//插入排序
function insertSort($arr)
{
$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;
}
}
}
return $arr;
}
var_dump(implode(',',insertSort($arr)));
结果如下:
4.快速排序
--索引数组
---递归出口:数组长度为1,直接返回数组
----数组元素有多个,则定义两个空数组
-----使用for循环进行遍历,把第一个元素当做比较的对象
------判断当前元素的大小,小的在左,大的在右
-------递归左,递归右
--------合并数组左、第一个元素、右
代码:
<?php
$arr = [1, 43, 54, 62, 21, 66, 32, 78, 36, 76, 39,2];
//快速排序
function quickSort($arr)
{
// 递归出口:数组长度为1,直接返回数组
$length = count($arr);
if ($length <= 1) return $arr;
// 数组元素有多个,则定义两个空数组
$left = $right = [];
// 使用for循环进行遍历,把第一个元素当做比较的对象
for ($i = 1; $i < $length; $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);
}
var_dump(implode(',',quickSort($arr)));exit;
结果如下: