标签:临时 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