题干如下:
考虑排序存储在数组A中的n个数: 首先找出A中最小元素 并将其与A[1]中元素进行交换. 接着,找出A中次小元素并惊奇与A[2]中元素进行交换.对A中前n-1个元素按该方式继续.
该算法称为选择算法,写出其伪代码
该算法维持的循环不变式是什么?
为什么它只需要对前n-1个元素 而非所有n个元素运行?
用θ几号给出选择排序的最好情况与最坏情况运行时间.
(1)
function addAction()
{
$arr = [31, 59, 42, 75, 26, 23, 19, 3, 42, 35, 2, 53, 4, 56, 2, 63, 6, 23, 45];
$result = [];
while (true) {
// 从剩余未排序的数组的第1个开始排序
$i = 0;
// 假设最小的就是第1个
$least_id = $i;
// 生成下一轮的剩余未排序数组
$left_arr = [];
while (true) {
// 每一轮找最小数时 都看是否所有的数都找了1遍
if (!isset($arr[$i + 1])) {
break;
}
if ($arr[$least_id] > $arr[$i + 1]) {
$left_arr[] = $arr[$least_id];
$least_id = $i + 1;
} else {
$left_arr[] = $arr[$i + 1];
}
$i++;
}
$result[] = $arr[$least_id];
$arr = $left_arr;
// 仅当没有剩余未排序数组时 所有排序均进行完毕
if (isBlank($left_arr)) {
break;
}
}
var_dump($result);
}
(2)循环不变式是:
最外层循环: 没有剩余未排序数组时 所有程序运行完毕
内层循环: 每一次找最小的数时 当找到本轮未排序数的最末个时 本轮查找最小数的循环完成
(3) 只需对n-1个元素排序 因为剩余最后一个未排序的数时,该数一定就是最大的数,直接排在已排好的数组的最后即可
(4)最好情况:θ(n^2)
最坏情况:θ(n^2)
因为不论排序是顺序还是逆序 每一轮都会比较所有的数组元素 最终的比较次数都是(1+2+...+(n-1))/2 = (1+(n-1))*(n-1)/2 是n的二次方函数.