行业资讯 php怎么从一个无序数组中找中数

php怎么从一个无序数组中找中数

314
 

PHP怎么从一个无序数组中找中数

在编程中,经常会遇到需要在数组中找到中数(中位数)的情况。中数是指将数组按照从小到大的顺序排列后,位于中间位置的数值。如果数组的元素个数为奇数,那么中数就是中间位置的元素;如果数组的元素个数为偶数,那么中数是中间两个元素的平均值。在PHP中,我们可以使用一些算法和技巧来高效地找到一个无序数组的中数。

方法一:排序法

最简单直观的方法是先对数组进行排序,然后根据数组长度的奇偶性来确定中数的位置。如果数组长度为奇数,中数就是排序后数组的中间元素;如果数组长度为偶数,中数就是排序后数组中间两个元素的平均值。

function findMedian($arr) {
    sort($arr);
    $length = count($arr);
    if ($length % 2 == 0) {
        $mid = $length / 2;
        $median = ($arr[$mid - 1] + $arr[$mid]) / 2;
    } else {
        $mid = (int)($length / 2);
        $median = $arr[$mid];
    }
    return $median;
}

方法二:快速选择法

排序法虽然能找到中数,但时间复杂度较高,为O(nlogn),在大规模数据下可能会耗费较多时间。另一种更高效的方法是使用快速选择法,该方法基于快速排序算法,通过递归地将数组分割为较小和较大的两个子数组,直到找到中数为止。

function partition(&$arr, $left, $right) {
    $pivot = $arr[$right];
    $i = $left - 1;
    for ($j = $left; $j < $right; $j++) {
        if ($arr[$j] < $pivot) {
            $i++;
            list($arr[$i], $arr[$j]) = array($arr[$j], $arr[$i]);
        }
    }
    list($arr[$i + 1], $arr[$right]) = array($arr[$right], $arr[$i + 1]);
    return $i + 1;
}

function quickSelect(&$arr, $left, $right, $k) {
    if ($left == $right) {
        return $arr[$left];
    }

    $pivotIndex = partition($arr, $left, $right);

    if ($k == $pivotIndex) {
        return $arr[$k];
    } elseif ($k < $pivotIndex) {
        return quickSelect($arr, $left, $pivotIndex - 1, $k);
    } else {
        return quickSelect($arr, $pivotIndex + 1, $right, $k);
    }
}

function findMedian($arr) {
    $length = count($arr);
    $mid = (int)($length / 2);
    return $length % 2 == 0 ? (quickSelect($arr, 0, $length - 1, $mid - 1) + quickSelect($arr, 0, $length - 1, $mid)) / 2 : quickSelect($arr, 0, $length - 1, $mid);
}

以上,我们介绍了两种在PHP中找到无序数组中位数的方法。排序法简单易懂,但对于大规模数据效率较低;而快速选择法虽然更加高效,但实现稍微复杂一些。在实际应用中,可以根据具体情况选择合适的方法来获得中数。希望本文对您在PHP中处理无序数组中位数问题有所帮助!

更新:2023-08-10 00:00:10 © 著作权归作者所有
QQ
微信
客服

.