PHP冒泡排序算法实现详解:从原理到实例全面解析
本文主要介绍PHP排序算法(冒泡排序)的实现方法。参考大华数据结构中的算法并结合实例更详细地分析了冒泡排序的原理和相关实现技术。有需要的朋友可以参考以下。

本文实例介绍了PHP排序算法Bubble Sort的实现方法。分享给大家,供大家参考,具体如下:
基本思想:
冒泡排序是交换排序的一种。其基本思想是:两两比较相邻记录的关键字,如果倒序则交换,直到没有倒序记录为止。
最简单的排序实现:
在学习各种排序方法之前我们先来看看经常使用的排序方法(至少对我来说是这样……):
//这里使用了类型提示(type hint) array,不熟悉或者不习惯的同学大可去掉,不影响运算结果
function MySort(array &$arr){
$length = count($arr);
for($i = 0;$i $arr[$j]){
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
}
$arr = array(9,1,5,8,3,7,4,6,2);
MySort($arr);
print_r($arr);
登录后复制
严格来说,上面的代码并不是标准的冒泡排序,因为它不满足“两两比较相邻记录”的冒泡排序思想。这只是一个简单的交换排序。其思想就是:从第一个关键字开始,将每个关键字与其后面的所有关键字进行比较,然后交换以获得最小值。但这种算法效率很低。
冒泡排序算法:
它重复遍历要排序的序列,一次比较两个元素,如果顺序错误则交换它们。重复访问数组的工作,直到不需要再进行交换,这意味着数组已经排序完毕。
该算法的名字来源于这样的事实:数组中较大的元素在排序后会逐渐“沉”到数组的后面,而较小的元素会逐渐“浮”到数组的前面,因此而得名。
冒泡排序算法的运行过程如下:(从后到前)
1. 比较相邻元素。如果第一个比第二个大,则交换它们。
2. 对每对相邻元素执行相同的操作,从第一对开始,到最后一对结束。此时,最后一个元素应该是最大的数字。
3. 对除最后一个元素之外的所有元素重复上述步骤。
4. 每次对越来越少的元素继续重复上述步骤,直到没有可比较的数字对。
光看文字描述你可能无法理解。我们看一下代码:
//交换方法
function swap(array &$arr,$a,$b){
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
}
//冒泡排序
function BubbleSort(array &$arr){
$length = count($arr);
for($i = 0;$i = $i;$j --){
//两两比较相邻记录
if($arr[$j] > $arr[$j + 1]){
swap($arr,$j,$j+1);
}
}
}
}
登录后复制
冒泡排序算法的改进:
《大话数据结构》确实是一本好书。还向我们介绍了冒泡排序算法的改进。这里我直接引用它的说法:
上面的冒泡排序算法还能优化吗?答案是肯定的。试想一下,如果我们要排序的序列是{2,1,3,4,5,6,7,8,9},也就是说除了第一个和第二个关键字之外,其他都需要交换。已经是正常秩序了。当i = 0时,2和1被交换,而此时的序列已经是有序的,但是算法仍然执行i = 2到9以及每个循环中的j循环,虽然没有交换数据,但是无数次的比较接下来的内容基本上是多余的。
当i=2时,我们已经比较了9和8、8和7、····、3和2,没有任何数据交换,这意味着序列已经有序,不需要继续。后续的判断就起作用了(后续的工作不会发生数据交换,重复做也没意义)。为了实现这个想法,我们需要改进代码,添加一个flag变量flag来实现这个算法的改进:
//交换方法
function swap(array &$arr,$a,$b){
$temp = $arr[$a];
$arr[$a] = $arr[$b];
$arr[$b] = $temp;
}
/冒泡排序的优化(如果某一次循环的时候没有发生元素的交换,则整个数组已经是有序的了)
function BubbleSort1(array &$arr){
$length = count($arr);
$flag = TRUE;
for($i = 0;($i = $i;$j --){
if($arr[$j] > $arr[$j + 1]){
swap($arr,$j,$j+1);
$flag = TRUE;
}
}
}
}
登录后复制
代码改动的关键是在i变量的for循环中添加flag是否为true的判断。经过这样的改进,冒泡排序的性能得到了提升,可以避免已经排序的情况带来的问题。无意义的循环判断。
冒泡排序是一种稳定排序。