经典算法之一,php冒泡排序实现

冒泡排序是非常容易理解和实现,以从小到大排序举例:
设数组长度为N。
1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
3.N=N-1,如果N不为0就重复前面二步,否则排序完成。

视频解释

BubbleSort1 一般写法
BubbleSort2 BubbleSort3 增加flag标志位 如果这一轮没交换数据则表示排序完成

function BubbleSort1($arr)
{
  $start = microtime(TRUE);
   $n = count($arr);
   $s = 0;
 for($i=0; $i<$n; $i++)
   {
       for($j=1; $j<$n-$i; $j++)
        {
           $s++;
           if($arr[$j-1] > $arr[$j])
                swap($arr[$j-1], $arr[$j]); 
        }
   }
   echo "*$s*\n";
   $end = microtime(TRUE)-$start;
  echo "BubbleSort1:$end\n<br/>";
    return $arr;
}

function BubbleSort2($arr)
{
    $start = microtime(TRUE);
   $n = count($arr);
   $s = 0;
 for($i=0; $i<$n; $i++)
   {
       $flag = TRUE;
       for($j=1; $j<$n-$i; $j++)
        {
           $s++;
           if($arr[$j-1] > $arr[$j])
            {
               $flag = FALSE;
              swap($arr[$j-1], $arr[$j]);
         }
       }
       if($flag) break;
    }
   echo "*$s*\n";
   $end = microtime(TRUE)-$start;
  echo "BubbleSort2:$end\n<br/>";
    return $arr;
}

function BubbleSort3($arr)
{
    $start = microtime(TRUE);
   $n = count($arr);
   $s = 0;
 $flag = TRUE;
   while ( $flag ) {
       $flag = FALSE;
      for($j=1; $j<$n; $j++)
       {
           $s++;
           if($arr[$j-1] > $arr[$j])
            {
               swap($arr[$j-1], $arr[$j]);
             $flag = TRUE;
           }
       }
       $n--;
   }
   echo "*$s*\n";
   $end = microtime(TRUE)-$start;
  echo "BubbleSort3:$end\n<br/>";
    return $arr;
}

//交换两个数
function swap(&$a, &$b)
{
    list ( $a, $b ) = array ($b, $a );
}

//创建随机数组
function createArray($leng)
{
 $start = microtime(TRUE);
   $arr = array();
 while ($leng--) {
       $arr[] = rand();
    }
   $end = microtime(TRUE)-$start;
  echo "createArray:$end\n<br/>";
    return $arr;
}

实例
$arr = createArray(4000);
$r = BubbleSort3($arr);
echo "\n<br/>";
$r = BubbleSort2($arr);
echo "\n<br/>";
$r = BubbleSort1($arr);

Comments are closed.