选择排序

思路

首先找到数组中最小的那个元素,将它和数组的第一个元素交换位置。再从剩余数组中找到最小的元素,将它与第二个元素交换位置。依次寻找并交换最小元素直到数组结尾处,选择排序便完成了。以长度为n的数组A为例说明:

  • 第1次从A[0]~A[n-1]中寻找最小值,与A[0]交换。
  • 第2次从A[1]~A[n-1]中寻找最小值,与A[1]交换。
  • 第i次从A[i-1]~A[n-1]中寻找最小值,与A[i-1]交换,直到i = n,此时剩余数组只有一个元素,并且每一个元素都比它后面的元素小,即已完成排序。

PHP代码

根据上文总结的思路,我们使用PHP来实现代码。

function selection_sort(array &$arr)
{
    $length = count($arr);
    for ($i = 0; $i < $length - 1; $i++) {
        // 将arr[i]和arr[i...length-1]中最小的元素交换
        $min = $i;
        for ($j = $i + 1; $j < $length; $j++) {
            if (less($arr, $j, $min)) {
                $min = $j;
            }
        }
        exch($arr, $i, $min);
    }
}

function less(array $arr, int $i, int $j)
{
    return $arr[$i] < $arr[$j];
}


function exch(array &$arr, int $i, int $j)
{
    list($arr[$i], $arr[$j]) = [$arr[$j], $arr[$i]];
}


$arr = [];
for ($i = 0; $i < 10; $i++) {
    $arr[$i] = rand(0, 10000);
}
print_r($arr);
selection_sort($arr);
print_r($arr);

性能

空间复杂度: \(O(1)\)

时间复杂度: \(O(n^2)\)

选择排序没有使用额外的存储空间,是原地排序算法,所以空间复杂度为:\(O(1)\)

时间复杂度的证明:每一次遍历都需要比较n-i次并交换一次元素,因此总共有N次交换以及n-1 + n-2 + .... + 2 + 1 = \({N(N-1) \over 2}\)次比较,可得时间复杂度是:\(O(n^2)\)

posted @ 2021-06-10 11:36  TianJiankun  阅读(60)  评论(0)    收藏  举报