PHP 基础算法:冒泡、归并、快速

一、冒泡排序

1、介绍:

        冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序。

2、具体步骤:

        a、比较相邻的元素。如果第一个比第二个大,就交换他们两个。

        b、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

        c、针对所有的元素重复以上的步骤,除了最后一个。

        d、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

3、代码:

/**
 * 冒泡排序
 * @param $arr
 * @return mixed
 */
function arrayBubblingSort($arr) {
    $count = count($arr);
    //外层控制排序轮次
    for ($i = 0; $i < $count - 1; $i ++) {
        //内层控制每轮比较次数
        for ($j = 0; $j < $count - 1 - $i; $j ++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $temp        = $arr[$j];
                $arr[$j]     = $arr[$j + 1];
                $arr[$j + 1] = $temp;
            }
        }
    }
    return $arr;
}

二、归并排序

1、介绍:

        归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

2、具体步骤:

        a、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

        b、设定两个指针,最初位置分别为两个已经排序序列的起始位置

        c、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

        重复步骤c直到某一指针超出序列尾

        将另一序列剩下的所有元素直接复制到合并序列尾

3、代码

/**
 * 归并排序
 * @param array $array
 * @return array
 */
function allMergeSort($array = []) {
    $count = count($array);
    //递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组
    if ($count <= 1) {
        return $array;
    }
    $mid = intval($count / 2);

    //拆分数组0-mid这部分给左边left_array
    $left_array = array_slice($array, 0, $mid);

    //拆分数组mid-末尾这部分给右边right_array
    $right_array = array_slice($array, $mid);

    //左边拆分完后开始递归合并往上走
    $left_array = allMergeSort($left_array);

    //右边拆分完毕开始递归往上走
    $right_array = allMergeSort($right_array);

    //合并两个数组,继续递归
    $return_array = mergeSort($left_array, $right_array);
    return $return_array;
}

/**
 * @param $left_array
 * @param $right_array
 * @return array
 */
function mergeSort($left_array, $right_array) {
    $return_array = [];
    while (count($left_array) && count($right_array)) {
        
        $return_array[] = $left_array[0] < $right_array[0] ? array_shift($left_array) : array_shift($right_array);
    }
    return array_merge($return_array, $left_array, $right_array);
}

三、快速排序

1、介绍:

        设要排序的数组是A[0]……A[N-1],⾸先任意选取⼀个数据(通常选⽤数组的第⼀个数)作为关键数据,然后将所有⽐它⼩的数都放到它左边,所有⽐它⼤的数都放到它右边,这个过程称为⼀趟快速排序。值得注意的是,快速排序不是⼀种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产⽣变动

2、具体步骤:

        a、在数组中选⼀个基准数(通常为数组第⼀个);
        b、将数组中⼩于基准数的数据移到基准数左边,⼤于基准数的移到右边;
        c、对于基准数左、右两边的数组,不断重复以上两个过程,直到每个⼦集只有⼀个元素,即为全部有序。

3、代码

/**
 * 数组快速排序
 * @param $array
 * @return bool|array
 */
function arrayQuickSort($array) {
    if (!is_array($array))
        return false;
    if (count($array) > 1) {
        $left = $right = [];
        for ($i = 1; $i < count($array); $i ++) {
            if ($array[$i] <= $array[0]) {
                $left[] = $array[$i];
            } else {
                $right[] = $array[$i];
            }
        }
        $left  = arrayQuickSort($left);
        $right = arrayQuickSort($right);
        return array_merge($left, [$array[0]], $right);
    } else {
        return $array;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值