开头先说一下,学习这些排序算法其实只是学习这些算法的思路,PHP开发的时候最好用PHP内置的排序函数,因为PHP内置的排序函数是底层代码实现的,比我们自己用PHP手动写的函数速度快得多得多。
我们用来排序的数组必须是符合
- 数组开始索引是明确的,一般是0。
- 数组索引的必须是连续的整型或者数字字符串或者两者混合。
比如:
//连续的数字字符串索引数组
$arr = [
'0' => 3,
'1' => 2,
'2' => 4,
];
//连续的数字索引数组
$arr = [
0 => 3,
1 => 2,
2 => 4,
];
//混合索引,数字和数字字符串都有
$arr = [
'0' => 7,
1 => 3,
'2' => 2,
3 => 4,
'4'=> 6,
];
//这种字符串索引数组是不行的
$arr = [
'a' => 3,
'b' => 2,
'c' => 4,
];
//这种不连续索引数组也是不行的
$arr = [
0 => 3,
2 => 2,
3 => 4,
];
冒泡排序(Bubble Sort)
假设有一个数组,这个数组共有100个元素。
- 数组中第一个元素的值和数组中第二个元素的值进行大小比较,如果第一个元素的值大于第二个元素的值则把第一个元素的值和第二个元素的值进行交换,如果第一个元素的值不大于第二个元素的值则不进行值的交换,这时候不管值交不交换,第二元素的值肯定是比第一个元素的值大的。
- 第二个元素的值再和第三个元素的值按第一点提到的逻辑继续进行比较,比较过后第三个元素的值肯定比第一个元素和第二个元素的值大。
- 按以上两点的逻辑,第四个元素的值和第五个元素的值进行比较,接着第五个元素的值和第六个元素的值进行比较,这样一直比较下去。
- 当第九十九个元素的值和第一百个元素的值进行比较后,第一百个元素的值肯定比前九十九个元素的值大。这时候我们就找到这个数组中最大的值,这个值被我们一路进行两两比较,最后被交换到数组末尾的位置,这个行为有点像水平面下的气泡慢慢地浮到水平面上,所以就叫冒泡排序。(第一轮查找结束)
- 冒泡排序还没结束,经过以上的步骤我们只是找到了最大的值并把这个值排序在数组末尾,我们要接着找第二大的数。
- 以1、2、3点逻辑继续开始寻找第二大的数。
- 当第九十八个元素的值和第九十九个元素的值进行比较后,第九十九个元素的值肯定比前九十八个元素的值大。这时候我们就找到这个数组中第二大的值(第九十九个元素的值和第一百个元素的值不需要再进行比较,第一百个元素的值已经是这个数组中最大的值,第九十九个元素的值肯定比第一百个元素的值小。) (第二轮查找结束)
- 按上面的逻辑继续寻找数组中第三大的数。
- 从上面的结论可以看出,第一轮查找结束的时候能找到数组中第一大的值,第二轮查找结束的时候能找到数组中第二大的值,所以第一百轮查找结束的时候能找到第一百大的值(最小的数),但我们其实只要查找到第九十九轮的时候就可以结束了,因为前九十九个数已经已经排序好了,剩下的这个数自然就不需要再排序了(第九十九轮查找的时候排序好的)。
- 经过以上所有步骤,这个数组已经被排序好。
PHP实现冒泡排序
升序版
大的往后冒泡(最简单)
function bubbleSort($arr)
{
for($len = count($arr),$n = 0; $n < $len -1;$n++)
/*
$len = count($arr) 获取数组元素个数。
$n = 0; 已经查找的轮数 或者 已经排序好的元素个数,一开始肯定是零。
$n < $len -1 限制需要查找的最大轮数 或者 需要排序的元素个数总数,这里要减一,因为100个元素我们只要查找99次就可以,剩下的哪个元素的位置早已经被固定。
*/
{
for($m = 0; $m < $len - $n -1;$m++)
/*
$m = 0,查找元素的索引。每次都从第一个元素开始查找,所以一开始的索引是零。
$m < $len - $n -1 限制查找元素的索引最大值, 查找元素索引最大值 应该 小于 数组元素个数 减去一 再减去 已经排序好的元素个数
比如 100个元素,0个排序好的元素,查找的最大索引应该是98,索引为99的元素我们会通过下面的方式,即 98 +1 的方式得出了,如果
不减一,再执行一次查找,会报错的,因为元素个数为100的数组没有索引为 99 +1 的元素。如果有已经排序好的元素,我们还要减去已经
排序好的元素个数,因为这些元素已经排序好,未排序好的元素的值肯定比已经排序好的元素的值小,不用再进行比较了。
*/
{
if($arr[$m] > $arr[$m+1]) //当前元素的值与下一个元素的值进行比较。
{
//如果当前元素的值比下一个元素的值大,则把当前元素的值与下一个元素的值进行交换。
$temp = $arr[$m+1]; //临时变量,用来交换两个变量的值。
$arr[$m+1] = $arr[$m];
$arr[$m] = $temp;
}
}
}
return $arr;
}
小的往前冒泡
function bubbleSort($arr)
{
for($len = count($arr),$n = 0; $n < $len -1;$n++)
{
for($m = $len -1; $m > $n;$m--)
{
if($arr[$m] < $arr[$m-1])
{
$temp = $arr[$m-1];
$arr[$m-1] = $arr[$m];
$arr[$m] = $temp;
}
}
}
return $arr;
}
降序版
小的往后冒泡
function bubbleSort($arr)
{
for($len = count($arr),$n = 0; $n < $len -1;$n++)
{
for($m = 0; $m < $len - $n -1;$m++)
{
if($arr[$m] < $arr[$m+1])
{
$temp = $arr[$m+1];
$arr[$m+1] = $arr[$m];
$arr[$m] = $temp;
}
}
}
return $arr;
}
大的往前冒泡
function bubbleSort($arr)
{
for($len = count($arr),$n = 0; $n < $len -1;$n++)
{
for($m = $len -1; $m > $n;$m--)
{
if($arr[$m] > $arr[$m-1])
{
$temp = $arr[$m-1];
$arr[$m-1] = $arr[$m];
$arr[$m] = $temp;
}
}
}
return $arr;
}