冒了个泡

2017-11-07  本文已影响17人  撸代码不如撸猫咪

没事写个冒泡玩玩,冒泡的基本原理(我这从后往前比较):

(1) 依次比较相邻的数,把大的或者小的数丢到后面(我这里按从小到大排序,> 把大的数放后头)。这样一次循环会把最小的数字排序到最左边。
(2)再对剩下的数字进行一次相同的操作,这样把第二小的数字放在第二个位>
置,一次做n-1次循环,就能把数字从小到大排好序。
(3)当如果入参的数组里,数字的一开始就有一定的顺序,比如 1、2、4、3、5、6,排序就只需要把4和3换个顺序,所以可以记录一个标志位,当没有需要更> 换位置时候,就可以退出遍历,这样只进行了11次循环,详见代码。

排序代码:

function bubbleSort(array $array)
{
    if ( ! is_array($array) || count($array) == 0) {
        return 'invalid input';
    }

    $len = count($array);

    if ($len == 1) {
        return $array;
    }

    //记录是否已经排好顺序
    $isOK = true;

    for ($i = 0; ($i < $len - 1) && $isOK; $i++) {
        $isOK = false;
        for ($j = $len - 2; $j >= $i; $j--) {
            if ($array[$j] > $array[$j + 1]) { //判断当前相邻数字大小
                //交换顺序
                $array[$j + 1] = $array[$j] + $array[$j + 1];
                $array[$j] = $array[$j + 1] - $array[$j];
                $array[$j + 1] = $array[$j + 1] - $array[$j];
                $isOK = true;
            }
        }
        //输出本次排序的结果
        echo '第' . ($i + 1) . '次排序结果:' . implode(",", $array) . "\n";
    }

    return $array;
}

$sort = array(1, 3, 2, 8, 3, 1, 100, 82, 21, 0, -1, 23);
//$sort = array(1, 2, 5, 4, 6, 7, 8);
$res = bubbleSort($sort);
echo "排序结果:" . implode(",", $res) . "\n";

输出结果:

bubbleSort.jpg
上一篇 下一篇

猜你喜欢

热点阅读