冒泡排序
思路:相邻的两个比较,前比后大则交换位置,时间复杂度O(n^2)
<?php
//外层for控制循环次数的,需要n-1次,内层for循环对相邻数进行比较,不符合预定排序的对数组值进行交换位置,
$arr = [4, 6, 2, 4, 523, 5, 62, 6, 3246, 25, 325, 76];
$count = count($arr);
//每次for即找到一个最大数,最后一位不需要比较
for ($i = 0; $i < $count - 1; $i++) {
//每次for即找到一个最大数,即比较过的则不需要比较了,故条件为$j<$count-$i;
for ($j = 1; $j < $count - $i; $j++) {
if ($arr[$j - 1] > $arr[$j]) {
$a = $arr[$j - 1];
$arr[$j - 1] = $arr[$j];
$arr[$j] = $a;
}
}
}
print_r($arr);
快速排序
思路:将第一个数作为基准值,不断递归拆分数组排序,直至数组为一个元素时,再将合并
//快速排序 将第一个数作为基准值,不断递归拆分数组排序,直至数组为一个元素时,再将合并
$quick = [2, 55, 3, 5, 62, 56, 23, 21, 455];
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];
}
}
//递归调用,直至数组长度为1
$left = quickSort($left);
$right = quickSort($right);
//将之前所有的递归进行合并
return array_merge($left, array($arr[0]), $right);
}
print_r(quickSort($quick));
选择排序
思路:第一个数向后比,后面所有数最小的作为第一个数(先取下标,再交换)
//选择排序 第一个数向后比,后面所有数最小的作为第一个数(先取下标,再交换)
$selec = [2, 55, 3, 5, 62, 56, 23, 21, 455];
function selectSort($arr)
{
$count = count($arr);
for ($i = 0;$i<$count-1;$i++){
$min = $i;
//找到最小值的下标
for ($j=$i+1;$j<$count-1;$j++){
$min = $arr[$min]>$arr[$j]?$j:$min;
}
//将最小值放到未排序的第一个
if ($min!=$i){
$tmp = $arr[$i];
$arr[$i]=$arr[$min];
$arr[$min]=$tmp;
}
}
return $arr;
}
print_r(selectSort($selec));
插入排序
思路:从第二个数开始,与前面的进行比较,若小于前面的数,则交换位置,但仍是这个数在进行比较
$insert = [2, 55, 3, 5, 62, 56, 23, 21, 455, 2234, 56215, 256, 26, 26, 235, 36, 29];
function insertSort($arr)
{
$count = count($arr);
for ($i = 1; $i < $count; $i++) {
$temp = $arr[$i];
for ($j = $i - 1; $j > 0; $j--) {
//比较的数之前的都是已经排好序的数组
if ($temp < $arr[$j]) {
$arr[$j + 1] = $arr[$j];
$arr[$j] = $temp;
} else {
break;
}
}
}
return $arr;
}
print_r(insertSort($insert));