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