下面分享一些最常见的算法,用PHP如何实现。

1、冒泡排序

// blog.phpha.com
function bubbleSort(array $arr): array
{
    $n = count($arr);
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = $i + 1; $j < $n; $j++) {
            if ($arr[$j] < $arr[$i]) {
                $temp = $arr[$i];
                $arr[$i] = $arr[$j];
                $arr[$j] = $temp;
            }
        }
    }
    return $arr;
}
// blog.phpha.com

2、归并排序

// blog.phpha.com
function merge(array &$arr, int $left, int $mid, int $right): void
{
    $i = $left;
    $j = $mid + 1;
    $k = 0;
    $temp = [];
    while ($i <= $mid && $j <= $right) {
        if ($arr[$i] <= $arr[$j]) {
            $temp[$k++] = $arr[$i++];
        } else {
            $temp[$k++] = $arr[$j++];
        }
    }
    while ($i <= $mid) {
        $temp[$k++] = $arr[$i++];
    }
    while ($j <= $right) {
        $temp[$k++] = $arr[$j++];
    }
    for ($i = $left, $j = 0; $i <= $right; $i++, $j++) {
        $arr[$i] = $temp[$j];
    }
}

function mergeSort(array &$arr, int $left, int $right): void
{
    if ($left < $right) {
        $mid = floor(($left + $right) / 2);
        mergeSort($arr, $left, $mid);
        mergeSort($arr, $mid + 1, $right);
        merge($arr, $left, $mid, $right);
    }
}
// blog.phpha.com

3、二分查找-递归

// blog.phpha.com
function binSearch(array $arr, int $low, int $high, mixed $value): int|false
{
    if ($low > $high) {
        return false;
    }
    $mid = floor(($low + $high) / 2);
    if ($value == $arr[$mid]) {
        return $mid;
    } elseif ($value < $arr[$mid]) {
        return binSearch($arr, $low, $mid - 1, $value);
    } else {
        return binSearch($arr, $mid + 1, $high, $value);
    }
}
// blog.phpha.com

4. 二分查找-非递归

// blog.phpha.com
function binSearch(array $arr, int $low, int $high, mixed $value): int|false
{
    while ($low <= $high) {
        $mid = floor(($low + $high) / 2);
        if ($value == $arr[$mid]) {
            return $mid;
        } elseif ($value < $arr[$mid]) {
            $high = $mid - 1;
        } else {
            $low = $mid + 1;
        }
    }
    return false;
}
// blog.phpha.com

5、快速排序

// blog.phpha.com
function quickSort(array $arr): array
{
    $n = count($arr);
    if ($n <= 1) {
        return $arr;
    }
    $key = $arr[0];
    $leftArr = [];
    $rightArr = [];
    for ($i = 1; $i < $n; $i++) {
        if ($arr[$i] <= $key) {
            $leftArr[] = $arr[$i];
        } else {
            $rightArr[] = $arr[$i];
        }
    }
    $leftArr = quickSort($leftArr);
    $rightArr = quickSort($rightArr);
    return array_merge($leftArr, [$key], $rightArr);
}
// blog.phpha.com

6、选择排序

// blog.phpha.com
function selectSort(array $arr): array
{
    $n = count($arr);
    for ($i = 0; $i < $n; $i++) {
        $k = $i;
        for ($j = $i + 1; $j < $n; $j++) {
            if ($arr[$j] < $arr[$k]) {
                $k = $j;
            }
        }
        if ($k != $i) {
            $temp = $arr[$i];
            $arr[$i] = $arr[$k];
            $arr[$k] = $temp;
        }
    }
    return $arr;
}
// blog.phpha.com

7、插入排序

// blog.phpha.com
function insertSort(array $arr): array
{
    $n = count($arr);
    for ($i = 1; $i < $n; $i++) {
        $tmp = $arr[$i];
        $j = $i - 1;
        while ($j >= 0 && $arr[$j] > $tmp) {
            $arr[$j + 1] = $arr[$j];
            $arr[$j] = $tmp;
            $j--;
        }
    }
    return $arr;
}
// blog.phpha.com