冒泡排序 - 改进篇

冒泡排序 - 改进篇

Posted by CHEN on March 15, 2019

看到的一些代码片段

PHP 实现冒泡排序 - 从小到大排序

<?php
    // 数组元素值从小到大排序
    
    $arr = [1, 42, 0, 3, 15, 7, 26, 19, 25, 23];
    
    // 定义一个中间变量
    
    $temp = 0;
    
    // 外层循环的次数
    
    for ($i = 0; $i < count($arr) - 1; $i++) {
        $exchange = false;
    
        // 内层之间向右相邻的两个数组元素值进行比较
        
        for ($j = 0; $j < count($arr) - 1 - $i; $j++) {
    
            // 当后一个数组元素值大于前一个数组元素值
            
            if ($arr[$j] > $arr[$j + 1]) {
    
                // 数组元素交换
                
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
                $exchange = true;
            }
        }
    
        // 外层数组循环的次数是  count($arr)-1
        // -1的原因 数组元素值比较时是两个比较 如 3 个数组元素比较 2 次
        
        echo '这是第' . ($i+1) . '次比较的结果';
        echo '<pre>';
        print_r($arr);
        if (!$exchange)
            break;
    }
    
    echo '<hr color="red" />';
    print_r($arr);

tips:添加一个布尔变量 $exchange, 以监视每($i+1)次冒泡排序是否发生过相邻元素交换的情况。如果有($exchange为true),则需继续进行下一次冒泡排序。如果没有发生过相邻元素交换的情况,则说明排序任务已经完成,无需进行下一次冒泡排序。这时,使用 break,立刻跳出 $i 循环体