PHP中常见的四种算法

分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。 15,33,5,89,6,4

1.冒泡排序

原理分析:

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码实现:

<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2017/10/30
 * Time: 16:23
 */
$arr = [15,33,5,89,6,4];
function bubbleSort($arr)
{
    $count = count($arr);
    //该层循环控制 需要冒泡的轮数
    for ($i=0; $i<$count; $i++)
    {
        //该层循环用来控制每轮 冒出一个数 需要比较的次数
        for ($k=0; $k<$count-$i-1; $k++){
            if($arr[$k]>$arr[$k+1])
            {
                $tmp = $arr[$k+1];
                $arr[$k+1] = $arr[$k];
                $arr[$k] = $tmp;
            }
        }
    }
    return $arr;
}
var_dump(bubbleSort($arr));

最后结果:

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

2.快速排序法

原理分析:

  • 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

代码实现:

<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2017/10/30
 * Time: 17:26
 */
$arr = [15,33,5,89,6,4];
function quickSort($arr){
    //判断是不是还有进行
    if (count($arr)>1){
        //指定基准
        $k = $arr[0];
        //设置左边数组
        $x = [];
        //设置右边数组
        $y = [];
        for ($i=1; $i<count($arr); $i++)
        {
            //进行判断
            if ($k>$arr[$i]){
                $x[] = $arr[$i];
            }else{
                $y[] = $arr[$i];
            }
        }
        //递归执行
        $x = quickSort($x);
        $y = quickSort($y);
        //合并数组
        return array_merge($x,array($k),$y);
    }else {
        return $arr;
    }
}
var_dump(quickSort($arr));

最后结果:

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

3.选择排序法

原理分析:

  • 在数组中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

代码实现:

<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2017/10/30
 * Time: 18:10
 */
$arr = [15,33,5,89,6,4];
function selectSort($arr)
{
    $count = count($arr);
    for($i=0; $i<$count-1; $i++) {
        //先假设最小的值的位置
        $p = $i;
        for($j=$i+1; $j<$count; $j++) {
            //$arr[$p] 是当前已知的最小值
            if($arr[$p] > $arr[$j]) {
                //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
                $p = $j;
            }
            //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
            if($p != $i) {
                $tmp = $arr[$p];
                $arr[$p] = $arr[$i];
                $arr[$i] = $tmp;
            }
        }
    }
    //返回最终结果
    return $arr;
}
var_dump(selectSort($arr));

最后结果:

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

4.插入排序法

原理分析:

  • 每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

代码实现:

<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2017/10/30
 * Time: 18:20
 */
$arr = [15,33,5,89,6,4];
function insertSort($arr)
{
    $count = count($arr);
    for($i=1; $i<$count; $i++){
        $tmp = $arr[$i];
        //内层循环控制,比较并插入
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    return $arr;
}
var_dump(insertSort($arr));

最后结果:

array(6) { [0]=> int(4) [1]=> int(5) [2]=> int(6) [3]=> int(15) [4]=> int(33) [5]=> int(89) }

算法是一门高深的学问 :)

posted @ 2019-03-05 21:19  蒋华  阅读(519)  评论(0编辑  收藏  举报