冒泡排序是非常容易理解和实现,以从小到大排序举例:
设数组长度为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);