PHP冒泡排序(Bubble Sort)算法详解

前言

冒泡排序大概的意思是依次比较相邻的两个数,而后根据大小作出排序,直至最后两位数。因为在排序过程当中老是小数往前放,大数日后放,至关于气泡往上升,因此称做冒泡排序。但其实在实际过程当中也能够根据本身须要反过来用,大树往前放,小数日后放。php

实战

直接上代码:算法

<?php
/**
 * 冒泡排序算法示例
 */

// 这里以一维数组作演示
$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);

// 第一层for循环能够理解为从数组中键为0开始循环到最后一个
for ($i=0;$i<count($demo_array);$i++) {
    // 第二层将从键为$i的地方循环到数组最后
    for ($j=$i+1;$j<count($demo_array);$j++) {
        // 比较数组中相邻两个值的大小
        if ($demo_array[$i] > $demo_array[$j]) {
            $tmp            = $demo_array[$i]; // 这里的tmp是临时变量
            $demo_array[$i] = $demo_array[$j]; // 第一次更换位置
            $demo_array[$j] = $tmp;            // 完成位置互换
        }
    }
}

// 打印结果集
echo '<pre>';
var_dump($demo_array);
echo '</pre>';

运行结果:数组

array(13) {
  [0]=>
  int(2)
  [1]=>
  int(5)
  [2]=>
  int(6)
  [3]=>
  int(11)
  [4]=>
  int(15)
  [5]=>
  int(21)
  [6]=>
  int(23)
  [7]=>
  int(25)
  [8]=>
  int(32)
  [9]=>
  int(43)
  [10]=>
  int(54)
  [11]=>
  int(65)
  [12]=>
  int(82)
}

从上面结果中,咱们能够看出,数组中键值顺序已经被改变,排序成功。code

若是说上面的算法是将数组中的键值按照值得大小从小到大进行排序,那么反之从大到小怎么操做呢?排序

很简单,只要修改一个比较符号就能够了,以下:for循环

<?php
/**
 * 冒泡排序算法示例
 */

// 这里以一维数组作演示
$demo_array = array(23,15,43,25,54,2,6,82,11,5,21,32,65);

// 第一层for循环能够理解为从数组中键为0开始循环到最后一个
for ($i=0;$i<count($demo_array);$i++) {
    // 第二层将从键为$i的地方循环到数组最后
    for ($j=$i+1;$j<count($demo_array);$j++) {
        // 比较数组中相邻两个值的大小
        if ($demo_array[$i] < $demo_array[$j]) {
            $tmp            = $demo_array[$i]; // 这里的tmp是临时变量
            $demo_array[$i] = $demo_array[$j]; // 第一次更换位置
            $demo_array[$j] = $tmp;            // 完成位置互换
        }
    }
}

// 打印结果集
echo '<pre>';
var_dump($demo_array);
echo '</pre>';

运行结果:变量

array(13) {
  [0]=>
  int(82)
  [1]=>
  int(65)
  [2]=>
  int(54)
  [3]=>
  int(43)
  [4]=>
  int(32)
  [5]=>
  int(25)
  [6]=>
  int(23)
  [7]=>
  int(21)
  [8]=>
  int(15)
  [9]=>
  int(11)
  [10]=>
  int(6)
  [11]=>
  int(5)
  [12]=>
  int(2)
}

就这样,轻松地改变了顺序。原理

延伸

若是仔细观察以上代码,就会发现有一个地方值得关注,就是互换变量值得地方。没错,这也是冒泡中的核心要点,这个技巧掌握了,之后一样能够用到其余地方。循环

这里咱们就稍微聊聊这个。技巧

原理:

如今有A、B两个变量,需求是将其值互换。

看到题目,咱们首先可能会想到直接赋值,可是若是直接赋值,不论先将谁赋值给谁,其中一个一定会被覆盖,由此咱们能够想出再弄出第三个变量C,暂时存储A或B中的值,这样就能够达到需求目标了。

$c = $a; // 暂存
$a = $b; // b给a
$b = $c; // 暂存的a值再给b

注:其实不须要第三个变量,也是能够达到互换A、B变量值的,能够借助substr()、str_replace()等方法,这里由于是介绍冒泡排序的,因此不过多延伸了。

总结

关于冒泡排序的就这么多,概括起来,主要就是两点:

  1. 循环比较

  2. 交换键值

可以完成这两点,基本就OK了,固然,关于冒泡排序的算法还有不少,这里只是其中一种,有兴趣的同窗能够本身研究下。

相关文章
相关标签/搜索