考虑排序存储在数组A中的n个数:首先找出A的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次最小元素并将其与A[2]中的元素进行交换。对A中前n-1个元素按该方式继续。该算法称为选择算法,写出其伪代码。该算法维持的循环不变式是什么?为什么它只需要对前n-1个元素,而不是对所有n个元素进行?用θ记号给出选择排序的最好情况与最坏情况运行时间。

伪代码如下:

算法导论 2.2-2 选择排序算法_数组

循环不变式:该算法维持的循环不变式是:A[1..j-1] 是已排序元素,且该已排序元素由整个数组最小的j-1个数组成。

为什么只需要对前n-1个元素进行:之所以只需要对前n-1个元素进行,是因为当进行了n-1个元素后,A[1..n-1]已排序,且这n-1个数为整个数组最小的n-1个数,由此可知最后一个数A[n]大于A[1..n-1]中的任意一个数,由此可知A[1..n]也是排好序的。

用θ记号给出选择排序的最好情况与最坏情况运行时间:最好情况下,整个数组是已排序的情况,这样第五行代码的检测将始终失败,因此不需要进行第六行代码的赋值操作运算,而在最坏情况下,整个数组是反向排序的情况,这样第五行代码始终检测成功,第六行代码始终进行赋值操作。不管是最好情况还是最坏情况,用θ描述始终为 θ算法导论 2.2-2 选择排序算法_数组_02算法导论 2.2-2 选择排序算法_循环不变式_03 。