原理:循环数组,每次固定最后一位最值
function bubble_sort($array) {
$length = count($array);
for ($i=$length-1; $i>=0; $i--) {
for ($j=0; $j<$i; $j++) {
if ( $array[$j] > $array[$j+1] ) {
$temp = $array[$j];
$array[$j] = $array[$j+1];
$array[$j+1] = $temp;
}
}
echo '循环后固定在队尾的最大值-->'.$array[$i].'<br>';
}
return $array;
}
$cc = bubble_sort(array(3,2,1,4));
echo '<pre>';
print_r($cc);
//输出
循环后固定在队尾的最大值-->4
循环后固定在队尾的最大值-->3
循环后固定在队尾的最大值-->2
循环后固定在队尾的最大值-->1
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
)
---
冒泡排序算法的改进
1. 设置一标志位变量pos,用于记录每趟排序最后一次交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只需要扫描到pos位置即可
function bubble_1($arr) {
$i = count($arr)-1;
while ( $i > 0 ) {
$pos = 0; //每趟开始时,无记录交换
for ($j=0; $j<$i; $j++) {
if ( $arr[$j] > $arr[$j+1] ) {
/* $temp = $arr[$j];
$arr[$j+1] = $arr[$j];
$arr[$j] = $temp; */
list($arr[$j], $arr[$j+1]) = array($arr[$j+1], $arr[$j]);
$pos = $j; //记录交换的位置
}
}
$i = $pos; //为下一趟排序作准备
}
return $arr;
}
$cc = bubble_1(array(3,2,1,4));
2.传统冒泡排序中每趟排序操作只能找到一个最值,我们考虑在每趟排序中进行正向和反向两次冒泡找到最大值和最小值,从而使排序趟数几乎减少了一半。
function bubble_2($arr) {
$low = 0;
$high = count($arr) - 1;
while ( $low < $high) {
for ($i=$low; $i<$high; $i++) { //正向冒泡,找到最大者
if ( $arr[$i] > $arr[$i+1] ) {
list($arr[$i], $arr[$i+1]) = array($arr[$i+1], $arr[$i]);
}
}
$high--; //修改high值, 前移一位
for ($i=$high; $i>$low; $i--) { //反向冒泡,找到最小者
if ( $arr[$i] < $arr[$i-1] ) {
list($arr[$i-1], $arr[$i]) = array($arr[$i], $arr[$i-1]);
}
}
$low++; //修改low值,后移一位
}
return $arr;
}
$cc = bubble_2(array(3,2,7,6,1,4,8));