我一直坚持这个问题,并希望有人能给出答案并解释。
给出一个没有重复元素的未排序数组A,并要求找到Kth 按降序排序的最大元素。例如,如果A是数组[11,6,1,2,15,7,4,8,20]和 K = 3,那么答案应该是[20,15,11]。描述如何修改选择排序和 heapsort解决这个问题(两个单独的答案)。什么是最坏的情况下你的运行时间 算法,作为N = A.length和K?
的函数答案 0 :(得分:3)
通常选择哪种选择:
正常运行时间为O(N * N)
,因为每个N
步骤都是搜索问题,即O(N)
。
您可以在找到第一个K元素时停止。如果你提早中止,那就不再是
N
步了;但每一步都没有改变。
等大O
因此,中止选择排序的是
O(K * N)
。
堆分类分两步完成:heapify和siftdown。 Heapify(创建堆结构)必须正确完成,并且它将保持不变。由于它在比siftdown更少的操作中执行,因此从堆排序的大O中省略它。
Siftdown(将堆中的元素交换为排序数组)与选择排序非常非常相似,但在每个N
步骤中执行以查找下一个最高元素的操作更快:{{1} }。
由于siftdown几乎完全相同,从概念上讲,作为选择排序,你可以在它找到最高
O(log N)
结果后立即中止。
这意味着大O
因此,中止堆排序的是
K
。