PHP五种基本算法-冒泡排序/选择排序/插入排序/快速排序/归并排序

  1. 冒泡排序
$arr = range(1,20);
shuffle($arr);
//冒泡排序start
function bubbleSort($arr) {
    $len = count($arr);
    for ($i=1;$i<$len;$i++) {
        for ($j=0;$j<$len-$i;$j++) {
            if($arr[$j] > $arr[$j+1]) {
                $temp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $temp;
            }
        }
    }
    return $arr;
}
$arr = bubbleSort($arr);
print_r($arr);
exit;
//冒泡排序end
  1. 选择排序
$arr = range(1,20);
shuffle($arr);
//选择排序start
function selectSort($arr)
{
    $len = count($arr);
    for ($i = 0; $i < $len - 1; $i++) {
        $p = $i;
        for ($j = $i + 1; $j < $len; $j++) {
            if ($arr[$p] > $arr[$j]) {
                $p = $j;
            }
        }
        if ($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    return $arr;
}
$arr = selectSort($arr);
print_r($arr);
exit;
//选择排序end
  1. 插入排序
$arr = range(1,20);
shuffle($arr);
//插入排序start
function insertSort($arr)
{
    $len = count($arr);
    for ($i = 1; $i < $len; $i++) {
        $tmp = $arr[$i];
        for ($j = $i - 1; $j >= 0; $j--) {
            if ($arr[$j] > $tmp) {
                $arr[$j + 1] = $arr[$j];
                $arr[$j] = $tmp;
            }
        }
    }
    return $arr;
}
$arr = insertSort($arr);
print_r($arr);
exit;
//插入排序end
  1. 快速排序
$arr = range(1,20);
shuffle($arr);
//快速排序start
function quickSort($arr)
{
    if (count($arr) <= 1) {
        return $arr;
    }
    $len = count($arr);
    $left = $right = [];
    for ($i = 1; $i < $len; $i++) {
        if ($arr[$i] < $arr[0]) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }
    $left = quickSort($left);
    $right = quickSort($right);
    return array_merge($left, array($arr[0]), $right);
}

$arr = quickSort($arr);
print_r($arr);
exit;
//快速排序end
  1. 归并排序
$arr = range(1,20);
shuffle($arr);
// 归并排序主程序
function mergeSort($arr)
{
    $len = count($arr);

    // 递归结束条件, 到达这步的时候, 数组就只剩下一个元素了, 也就是分离了数组
    if ($len <= 1) {
        return $arr;
    }

    $mid = intval($len / 2);             // 取数组中间
    $left = array_slice($arr, 0, $mid); // 拆分数组0-mid这部分给左边left
    $right = array_slice($arr, $mid);          // 拆分数组mid-末尾这部分给右边right
    $left = mergeSort($left);                 // 左边拆分完后开始递归合并往上走
    $right = mergeSort($right);                // 右边拆分完毕开始递归往上走
    $arr = merge($left, $right);             // 合并两个数组,继续递归

    return $arr;
}

// merge函数将指定的两个有序数组(arrA, arr)合并并且排序
function merge($arrA, $arrB)
{
    $arrC = array();
    while (count($arrA) && count($arrB)) {
        // 这里不断的判断哪个值小, 就将小的值给到arrC, 但是到最后肯定要剩下几个值,
        // 不是剩下arrA里面的就是剩下arrB里面的而且这几个有序的值, 肯定比arrC里面所有的值都大所以使用
        //从小到大 < || 从大到小 >
        $arrC[] = $arrA[0] < $arrB[0] ? array_shift($arrA) : array_shift($arrB);
    }
    return array_merge($arrC, $arrA, $arrB);
}

$arr = mergeSort($arr);
print_r($arr);
exit;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值