算法导论(第三版)第二章练习题2.2-1 考虑排序存储在数组A中的n个数...

题干如下:

考虑排序存储在数组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的二次方函数.

 

你可能感兴趣的:(算法导论,算法导论)