首页 > 代码库 > 关于冒泡排序

关于冒泡排序

1. [代码]南湖船老大版PHP冒泡     

<?<?php
$array = array(7,1,2,8,4,5,6,0,22,9);
$len=count($array);
for ($i=0;$i<$len;$i++) {
  for ($j=$len-1;$j>$i;$j--) {
    if ($array[$j-1] > $array[$j]) {
      $tmp=$array[$j];
      $array[$j]=$array[$j-1];
      $array[$j-1]=$tmp;
    }
  }
}

2. [代码]eechen版PHP冒泡代码     

<?php
//eechen版代码
$array = array(0,1,2,3,4,5,6,7,8,9);
for ($i=0;$i<count($array);$i++) {
  for ($j=0;$j<count($array)-1;$j++) {
    if ($array[$j] < $array[$j+1]) {
      $temp = $array[$j];
      $array[$j] = $array[$j+1];
      $array[$j+1] = $temp;
    }
  }
}

细心看这两个版本就会发现南湖船老大的冒泡效率会更高,总的循环次数为45次。

而eechen的则需要循环90次是船老大的一倍。

虽然只是一个小小的冒泡但是不同的写法这差距就大了去了。

评论区有大牛给的一个更优版

function pop($stack) {
    $l = count($stack);
    for ($m = 1; $m < $l; $m++) {
        $pin = false;    
        for ($n = $l - 1; $n >= $m; $n--) {
            if ($stack[$n] < $stack[$n - 1]) {
                $temp = $stack[$n];
                $stack[$n] = $stack[$n - 1];
                $stack[$n - 1] = $temp;
                $pin = true;
            }
        }
        if (!$pin) {
            return $stack;
        }
    }
}

$stack = [5, 48, 1, 4, 2, 8, 6, 8, 6];
$res = pop($stack);
print_r($res);

 如果原始数据是有序的(没有执行交换)则只需要返回原始数据即可,避免了无用的循环与比较。

关于冒泡排序