选择排序
思路
首先找到数组中最小的那个元素,将它和数组的第一个元素交换位置。再从剩余数组中找到最小的元素,将它与第二个元素交换位置。依次寻找并交换最小元素直到数组结尾处,选择排序便完成了。以长度为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)\)