前言
冒泡排序大概的意思是依次比较相邻的两个数,然后根据大小做出排序,直至最后两位数。由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。但其实在实际过程中也可以根据自己需要反过来用,大树往前放,小数往后放。
实战
直接上代码:
<?php
/**
* 冒泡排序算法示例
*/
// 这里以一维数组做演示
$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);
// 第一层for循环可以理解为从数组中键为0开始循环到最后一个
for ($i=0;$i<count($demo_array);$i++) {
// 第二层将从键为$i的地方循环到数组最后
for ($j=$i+1;$j<count($demo_array);$j++) {
// 比较数组中相邻两个值的大小
if ($demo_array[$i] > $demo_array[$j]) {
$tmp = $demo_array[$i]; // 这里的tmp是临时变量
$demo_array[$i] = $demo_array[$j]; // 第一次更换位置
$demo_array[$j] = $tmp; // 完成位置互换
}
}
}
// 打印结果集
echo '<pre>';
var_dump($demo_array);
echo '</pre>';
运行结果:
array(13) {
[0]=>
int(2)
[1]=>
int(5)
[2]=>
int(6)
[3]=>
int(11)
[4]=>
int(15)
[5]=>
int(21)
[6]=>
int(23)
[7]=>
int(25)
[8]=>
int(32)
[9]=>
int(43)
[10]=>
int(54)
[11]=>
int(65)
[12]=>
int(82)
}
从上面结果中,我们可以看出,数组中键值顺序已经被改变,排序成功。
如果说上面的算法是将数组中的键值按照值得大小从小到大进行排序,那么反之从大到小怎么操作呢?
很简单,只要修改一个比较符号就可以了,如下:
<?php
/**
* 冒泡排序算法示例
*/
// 这里以一维数组做演示
$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);
// 第一层for循环可以理解为从数组中键为0开始循环到最后一个
for ($i=0;$i<count($demo_array);$i++) {
// 第二层将从键为$i的地方循环到数组最后
for ($j=$i+1;$j<count($demo_array);$j++) {
// 比较数组中相邻两个值的大小
if ($demo_array[$i] < $demo_array[$j]) {
$tmp = $demo_array[$i]; // 这里的tmp是临时变量
$demo_array[$i] = $demo_array[$j]; // 第一次更换位置
$demo_array[$j] = $tmp; // 完成位置互换
}
}
}
// 打印结果集
echo '<pre>';
var_dump($demo_array);
echo '</pre>';
运行结果:
array(13) {
[0]=>
int(82)
[1]=>
int(65)
[2]=>
int(54)
[3]=>
int(43)
[4]=>
int(32)
[5]=>
int(25)
[6]=>
int(23)
[7]=>
int(21)
[8]=>
int(15)
[9]=>
int(11)
[10]=>
int(6)
[11]=>
int(5)
[12]=>
int(2)
}
就这样,轻松地改变了顺序。
延伸
如果仔细观察以上代码,就会发现有一个地方值得关注,就是互换变量值得地方。没错,这也是冒泡中的核心要点,这个技巧掌握了,以后同样可以用到其他地方。
这里我们就稍微聊聊这个。
原理:
现在有A、B两个变量,需求是将其值互换。
看到题目,我们首先可能会想到直接赋值,但是如果直接赋值,不论先将谁赋值给谁,其中一个必定会被覆盖,由此我们可以想出再弄出第三个变量C,暂时存储A或B中的值,这样就可以达到需求目标了。
$c = $a; // 暂存
$a = $b; // b给a
$b = $c; // 暂存的a值再给b
注:其实不需要第三个变量,也是可以达到互换A、B变量值的,可以借助substr()、str_replace()等方法,这里因为是介绍冒泡排序的,所以不过多延伸了。
总结
关于冒泡排序的就这么多,归纳起来,主要就是两点:
循环比较
交换键值
能够完成这两点,基本就OK了,当然,关于冒泡排序的算法还有很多,这里只是其中一种