浅析冒泡算法

原理:冒泡算法就是将较小的元素搬移到数组的开始,将较大的元素慢慢地往数组的尾部移动,小的数据就像气泡一下往上冒,而大的数据就像石头一样往下沉。

总结出两个方法,分别是「递归」、「双层for循环」实现:  

  「双增for循环」:for()方法内传入一个数组,对数组进行循环n-1次,并判断,两两比较,前值是否大于后值,如果是则交换。依次再次进行循环数组n-1次,最后返回有序的数组。

$arr = [1, 2, 4, 1, 23, 22, 12, 54, 65, 23];
function maopao($arr)
{
    $len = count($arr);

    // 该层循环控制 需要冒泡的轮数
    for ($i = 1; $i < $len; $i++) {

        // 该层循环用来控制每轮冒出一个数 需要比较的次数
        for ($k = 0; $k < $len - $i; $k++) {
            if ($arr[$k] > $arr[$k + 1]) {
                $tmp = $arr[$k + 1]; // 声明一个临时变量
                $arr[$k + 1] = $arr[$k];
                $arr[$k] = $tmp;
            }
        }
    }
    return $arr;
}

「递归」:原理其实和双增for循环一致

/**
 * @param $arr 传入要排序的数组
 * @param int $index 循环次数
 * @return mixed
 */
function maopao1($arr, $index = 0)
{
    $len = count($arr);

    if ($len < $index) {
        return $arr;
    }

    for ($i = $index; $i < ($len - 1); $i++) {
        if ($arr[$i] > $arr[$i + 1]) {
            $tmp = $arr[$i + 1];
            $arr[$i] = $tmp;
            $arr[$i + 1] = $arr[$i];
        }
    }
    $index++;
    return maopao1($arr, $index);
}


//array(10) {
// [0]=>
// int(1)
// [1]=>
// int(1)
// [2]=>
// int(2)
// [3]=>
// int(4)
// [4]=>
// int(12)
// [5]=>
// int(22)
// [6]=>
// int(23)
// [7]=>
// int(23)
// [8]=>
// int(54)
// [9]=>
// int(65)
//}
 
原文地址:https://www.cnblogs.com/houdabao/p/8516131.html