码迷,mamicode.com
首页 > 编程语言 > 详细

算法系列:冒泡排序法

时间:2018-07-14 14:39:53      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:临时   tail   while   function   循环   --   cti   for   数据规模   

一、基本思路

通过两两比较,然后交换双方位置的一种排序方法。

二、示例代码

$arr = array(1,4,2,6,3,8);
for($i=0;$i<count($arr)-1;$i++){    
    for($j=$i+1;$j<count($arr);$j++){       

        if($arr[$i]>$arr[$j]){  //如果前面的数比后面的大,则进行交换     
            $temp = $arr[$j];           
            $arr[$j] = $arr[$i];
            $arr[$i] = $temp;           
        }
    }
}
//$arr = array(1,2,3,4,6,8)

三、分析说明

1、需要两层循环
2、第一层循环从第一个数开始,截止到倒数第二个数
3、第二层循环从第一个数的后面开始,截止到最后一个数。
4、当前面的数比后面的大时,进行位置互换,互换需要一个临时变量。

四、复杂度分析

1、第一层循环需要执行n-1次,第二层循环也要执行n-1次
2、总执行次数为(n-1)*(n-1) = n^2 - 2n + 1
3、时间复杂度为n^2

数量n 执行次数

2 1

3 4

4 9

5 16

... ...

101 10000

五、备注

冒泡法思路简单,实现简单,对于数据规模比较小的情况下适合使用。

六、双向冒泡(鸡尾酒冒泡)

这是一种左到右,右到左,反复扫描排序模式,整体排序效率略高于单向冒泡,但是实现起来复杂的多。

当待排序数组比较规则时(大部分已排序)效率比单向冒泡高。

//交换函数
function swap(&$arr,$i,$j){

    $temp = $arr[$i];
    $arr[$i] = $arr[$j];
    $arr[$j] = $temp;

    return $arr;
}
//向右排序(大的往右放)
function leftSort(&$arr,$left,$right){

    for($i=$left;$i<$right;$i++){

        if($arr[$i]>$arr[$i+1]){

            swap($arr,$i,$i+1);
        }
    }   
}
//向左排序(小的往左放)
function rightSort(&$arr,$right,$left){

    for($i=$right;$i>$left;$i--){

        if($arr[$i-1]>$arr[$i]){

            swap($arr,$i-1,$i);
        }
    }
}

function CocktailSort(&$arr,$n){

    $left = 0;
    $right = $n-1;

    while($left < $right){

        leftSort($arr,$left,$right);
        $right -=1;
        rightSort($arr,$right,$left);
        $left +=1;  
    }
}

$arr = array(1,4,2,6,3,8);
$n = count($arr);
CocktailSort($arr,$n);

//arr = array(1,2,3,4,6,8);

算法系列:冒泡排序法

标签:临时   tail   while   function   循环   --   cti   for   数据规模   

原文地址:http://blog.51cto.com/12008764/2142219

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!