一、基本思路

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

二、示例代码

$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);