php 实现冒泡算法
冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来
例如我们需要将 12 35 99 18 76 这 5个数进行从大到小的排序。既然是从大到小排序,
也就是说越小的越靠后,你是不是觉得我在说废话,但是这句话很关键(∩_∩)。
首先比较第 1 位和第 2 位的大小,现在第 1 位是 12,第 2 位是 35。发现 12比 35 要小,
因为我们希望越小越靠后嘛,因此需要交换这两个数的位置。交换之后这 5 个数的顺序是
35 12 99 18 76。
按照刚才的方法,继续比较第 2 位和第 3 位的大小,第 2位是 12,第 3位是 99。12比
99 要小,因此需要交换这两个数的位置。交换之后这 5 个数的顺序是 35 99 12 18 76。
根据刚才的规则,继续比较第 3 位和第 4 位的大小,如果第 3 位比第 4 位小,则交换位
置。交换之后这 5 个数的顺序是 35 99 18 12 76。
最后,比较第 4 位和第 5 位。4 次比较之后 5 个数的顺序是 35 99 18 76 12。
经过 4 次比较后我们发现最小的一个数已经就位(已经在最后一位,请注意 12 这个数
的移动过程),是不是很神奇。现在再来回忆一下刚才比较的过程。每次都是比较相邻的两
个数,如果后面的数比前面的数大,则交换这两个数的位置。一直比较下去直到最后两个数
比较完毕后,最小的数就在最后一个了。就如同是一个气泡,一步一步往后“翻滚”,直到
最后一位。所以这个排序的方法有一个很好听的名字“冒泡排序”。
说到这里其实我们的排序只将 5 个数中最小的一个归位了。每将一个数归位我们将其称
为“一趟”。下面我们将继续重复刚才的过程,将剩下的 4个数一一归位。
好,现在开始“第二趟”,目标是将第 2 小的数归位。首先还是先比较第 1 位和第 2 位,
如果第 1 位比第 2 位小,则交换位置。交换之后这 5 个数的顺序是 99 35 18 76 12。接下来你
应该都会了,依次比较第 2 位和第 3 位,第 3 位和第 4 位。注意此时已经不需要再比较第 4
位和第 5 位。因为在第一趟结束后已经可以确定第 5 位上放的是最小的了。第二趟结束之后
这 5 个数的顺序是 99 35 76 18 12。
“第三趟”也是一样的。第三趟之后这 5 个数的顺序是 99 76 35 18 12。
现在到了最后一趟“第四趟”。有的同学又要问了,这不是已经排好了吗?还要继续?
当然,这里纯属巧合,你若用别的数试一试可能就不是了。你能找出这样的数据样例来吗?
请试一试。
“冒泡排序”的原理是:每一趟只能确定将一个数归位。即第一趟只能确定将末位上的
数(即第 5位)归位,第二趟只能将倒数第 2位上的数(即第 4 位)归位,第三趟只能将倒
数第 3 位上的数(即第 3 位)归位,而现在前面还有两个位置上的数没有归位,因此我们仍
然需要进行“第四趟”。
“第四趟”只需要比较第 1 位和第 2 位的大小。因为后面三个位置上的数归位了,现在
第 1 位是 99,第 2 位是 76,无需交换。这 5 个数的顺序不变仍然是 99 76 35 18 12。到此排
序完美结束了,5 个数已经有 4 个数归位,那最后一个数也只能放在第 1 位了。
最后我们总结一下:如果有 n 个数进行排序,只需将 n1 个数归位,也就是说要进行
n-1 趟操作。而“每一趟”都需要从第 1 位开始进行相邻两个数的比较,将较小的一个数放
在后面,比较完毕后向后挪一位继续比较下面两个相邻数的大小,重复此步骤,直到最后一
个尚未归位的数,已经归位的数则无需再进行比较(已经归位的数你还比较个啥,浪费表情)。
这个算法是不是很强悍?记得我每次拍集体照的时候就总是被别人换来换去的,当时特
别烦。不知道发明此算法的人当时的灵感是否来源于此。啰里吧嗦地说了这么多,下面是代
码。建议先自己尝试去实现一下看看,再来看我是如何实现的。
function bubbleSort(&$arr){
$count = count($arr);
for($i=0;$i<$count-1;$i++){
for($j=0;$j<$count-$i-1;$j++){
if($arr[$j] < $arr[$j+1]){
$t = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $t;
}
}
}
}
可以看出它的时间复杂度达到了 O(N²)

浙公网安备 33010602011771号