php实现冒泡排序,选择排序,插入排序和快速排序

本文详细介绍了四种基本排序算法的PHP实现,包括快速排序、冒泡排序、选择排序和插入排序,通过代码实例帮助读者巩固算法理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前自学数据结构的时候看过C语言版的四种基本排序法,C语言都忘的差不多了,最近有空就用php将四种排序法重新写了一遍,复习一下日益生疏的算法。直接贴上代码。

<?php
/**
 * 快速排序法
 * @param array $arr int数组
 * @param int $start 开始下标
 * @param int $end 结束下标
 */
function quickSort(&$arr, $start, $end)
{
    if($start < $end) {
        $mid = partition($arr, $start, $end);
        quickSort($arr, $start, $mid - 1);
        quickSort($arr, $mid + 1, $end);
    }
}

/**
 * 快速排序法切分
 * @param array int数组
 * @param int $start 开始下标
 * @param int $end 结束下标
 * @return int
 */
function partition(&$arr, $start, $end)
{
    $measure = $arr[$end];
    $p = $start - 1;
    for($i = $start; $i < $end; $i++) {
        if($arr[$i] <= $measure) {
            $p = $p + 1;
            $tmp = $arr[$i];
            $arr[$i] = $arr[$p];
            $arr[$p] = $tmp;
        }
    }
    $arr[$end] = $arr[$p + 1];
    $arr[$p + 1] = $measure;
    return $p + 1;
}

/**
 * 冒泡法
 * @param array $arr
 * @return mixed
 */
function bubbleSort($arr)
{
    $num = count($arr);
    $exchangeFlag = 1;
    for ($times = 0; $times < $num - 1 && $exchangeFlag; $times ++) {
        $exchangeFlag = 0;
        for ($pointer = 0; $pointer < $num -1 - $times; $pointer++) {
            if($arr[$pointer] > $arr[$pointer + 1]) {
                $tmp = $arr[$pointer + 1];
                $arr[$pointer + 1] = $arr[$pointer];
                $arr[$pointer] = $tmp;
                $exchangeFlag = 1;
            }
        }

    }
    return $arr;
}

/**
 * 选择排序
 * @param array $arr
 * @return array
 */
function selectSort($arr)
{
    $num = count($arr);
    if(!$num) return $arr;
    for($i = 0; $i < $num - 1; $i ++) {
        $tmp = $i;
        for ($j = $i + 1; $j < $num; $j++)
        {
            if($arr[$tmp] > $arr[$j]) {
                $tmp = $j;
            }
        }
        if($tmp != $i) {
            $cache = $arr[$tmp];
            $arr[$tmp] = $arr[$i];
            $arr[$i] = $cache;
        }
    }
    return $arr;
}

/**
 * 插入排序
 * @param array $arr
 * @return mixed
 */
function insertSort($arr)
{
    $num = count($arr);
    if(!$num) return $arr;
    for ($i = 1; $i < $num; $i ++) {
        $tmp = $arr[$i];
        $a = $i - 1;
        while ($a > -1 && $arr[$a] > $tmp) {
            $arr[$a + 1] = $arr[$a--];
        }
        $arr[$a + 1] = $tmp;
    }
    return $arr;
}

/**
 * 归并排序
 * @param array $arr
 * @param int $start
 * @param int $end
 */
function mergeSort(&$arr, $start, $end)
{
    if($start < $end) {
        $mid = (int)(($start + $end) / 2);
        mergeSort($arr, $start, $mid);
        mergeSort($arr, $mid + 1, $end);
        merge($arr, $start, $mid, $end);
    }
}

/**
 * 归并排序的合并操作
 * @param array $arr
 * @param int $start
 * @param int $mid
 * @param $end
 */
function merge(&$arr, $start, $mid, $end)
{
    $left = $right = [];
    $aNum = $mid - $start + 1;
    $bNum = $end - $mid;
    for($i = $start; $i < $mid + 1; $i++) {
        $left[] = $arr[$i];
    }
    for($i = $mid + 1; $i < $end + 1; $i++) {
        $right[] = $arr[$i];
    }
    $a = $b = 0;
    $n = $start;
    while ($a < $aNum && $b < $bNum) {
        if($left[$a] < $right[$b]) {
            $arr[$n ++] = $left[$a ++];
        } else {
            $arr[$n ++] = $right[$b ++];
        }
    }
    while ($a < $aNum) {
        $arr[$n ++] = $left[$a ++];
    }
    while ($b < $bNum) {
        $arr[$n ++] = $right[$b ++];
    }
}

function printInfo($info)
{
    echo "=================================={$info}============================\n";
}

$arr = [2,4,5,7,1,3,19,23,16,33,12];
printInfo('original array');
print_r($arr);

printInfo('selectSort result');
print_r(selectSort($arr));

printInfo('bubbleSort result');
print_r(bubbleSort($arr));

printInfo('insertSort result');
print_r(insertSort($arr));

printInfo('quickSort result');
$qSortedArr = $arr;
quickSort($qSortedArr, 0 , count($arr) - 1);
print_r($qSortedArr);

printInfo('mergeSort result');
$mSortedArr = $arr;
mergeSort($mSortedArr, 0 , count($arr) - 1);
print_r($mSortedArr);

运行结果:

==================================original array============================
Array
(
    [0] => 2
    [1] => 4
    [2] => 5
    [3] => 7
    [4] => 1
    [5] => 3
    [6] => 19
    [7] => 23
    [8] => 16
    [9] => 33
    [10] => 12
)
==================================selectSort result============================
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 12
    [7] => 16
    [8] => 19
    [9] => 23
    [10] => 33
)
==================================bubbleSort result============================
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 12
    [7] => 16
    [8] => 19
    [9] => 23
    [10] => 33
)
==================================insertSort result============================
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 12
    [7] => 16
    [8] => 19
    [9] => 23
    [10] => 33
)
==================================quickSort result============================
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 12
    [7] => 16
    [8] => 19
    [9] => 23
    [10] => 33
)
==================================mergeSort result============================
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 7
    [6] => 12
    [7] => 16
    [8] => 19
    [9] => 23
    [10] => 33
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值