冒泡排序
这个算法的名字由来是因为数组中越大的元素会由于一次次排序后逐渐“沉”到数组的后面,而越小的元素会逐渐“浮”到数组的前面,故名。
基本思想:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。
冒泡排序优化思想:如果某一次循环的时候没有发生元素的交换,则整个数组已经是有序的了
下面我们采用 函数式编程 思想用代码来实现
PHP代码实现之普通方式:
$arr = array(‘4′,’3′,’8′,’9′,’2′,’1’);
//普通方式调用
// $arr = bubbleSort1($arr);
// $arr = bubbleSort2($arr);
// $arr = optimizeBubbleSort($arr);
//采用引用的方式实现调用
// bubbleSort1($arr);
// bubbleSort2($arr);
// optimizeBubbleSort($arr);
//格式化输出数组
echo “<pre>”;
print_r($arr);
echo “</pre>”;
//方法一
function bubbleSort1($arr){
$ length = count($arr);
for($i=0;$i<=$length;$i++){
for($j=$length-1;$j>$i;$j–){
if($arr[$j]<$arr[$j-1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $temp;
}
}
}
return $arr;
}
//方法二
function bubbleSort2($arr){
$length = count($arr);
for($i=1;$i<$length;$i++)
{
for($j=0;$j<$length-$i;$j++){
if($arr[$j]>$arr[$j+1]){
$temp = $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}
//优化方法
function optimizeBubbleSort($arr){
$length = count($arr);
$flag = TRUE;
for($i = 0;($i < $length – 1) && $flag;$i ++){
$flag = FALSE ;
for($j = $length – 2;$j >= $i;$j –){
if($arr[$j] > $arr[$j + 1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
$flag = TRUE;
}
}
}
return $arr;
}
PHP代码实现之引用:
//交换方法
function exchangeMethod(array &$arr,$i,$j){
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
//方法一
function bubbleSort1(array &$arr){
$length = count($arr);
for($i=0;$i<=$length;$i++){
for($j=$length-1;$j>$i;$j–){
if($arr[$j]<$arr[$j-1]){
exchangeMethod($arr,$j,$j-1);
}
}
}
}
//方法二
function bubbleSort2(array &$arr){
$length = count($arr);
for($i=1;$i<$length;$i++)
{
for($j=0;$j<$length-$i;$j++){
if($arr[$j]>$arr[$j+1]){
exchangeMethod($arr,$j+1,$j);
}
}
}
}
//优化方法
function optimizeBubbleSort(array &$arr){
$length = count($arr);
$flag = TRUE;
for($i = 0;($i < $length – 1) && $flag;$i ++){
$flag = FALSE;
for($j = $length – 2;$j >= $i;$j –){
if($arr[$j] > $arr[$j + 1]){
exchangeMethod($arr,$j,$j+1);
$flag = TRUE;
}
}
}
}
想了解更多,请关注订阅我们的头条号:IT点点滴,每天更新一篇您身边的IT点点滴