问题描述:
问题求解:
a. 使用归并排序或堆排序对输入数据进行排序,均花费O(n*lgn)最坏情况运行时间(不要使用快排或插入排序,他们均花费O(n^2)的时间)。将i个最大元素(在已排序数组中直接可以获得)放到输出数组中,花费时间O(i)。
因此,总的最坏情况运行时间:O(n * lgn+i)=O(n * lgn) (因为i <= n)。
b.用堆来实现优先队列。使用BUILD-HEAP建堆,花费O(n)时间;然后调用
HEAP-EXTRACT-MAX 函数i次,以得到i个最大元素,使用时间O(i*lgn);然后将从输出数组提取到的逆序存储。最坏的情况下提取时间为O(i * lgn)。
最坏情况运行时间为:O(n + i*lgn)。
c.利用选择算法(SELECT algorithm)来找到第i大的元素,花费时间O(n);利用该元素划分(Partition),花费O(n)时间;排序i个最大元素,花费O(i*lgi)最坏时间(利用归并或堆排序)。总的最坏运行时间:O(n + i * lgi).