首页 文章

K个数组中最大的元素,排序算法

提问于
浏览
0

我一直坚持这个问题,并希望有人会给出答案并解释 .

您将获得一个没有重复元素的未排序数组A,并要求按降序排序查找第K个最大元素 . 例如,如果A是数组[11,6,1,2,15,7,4,8,20]和K = 3,那么答案应该是[20,15,11] . 描述如何修改选择排序和heapsort来解决这个问题(两个单独的答案) . 作为N = A.length和K的函数,算法运行时间最差的是什么?

1 回答

  • 3

    通常选择什么类型:

    • 找到最高元素,换到第一名

    • 找到下一个最高元素,交换到第二位

    • ......

    • 查找倒数第二个元素,交换到倒数第二个位置

    • 完成 .

    正常运行时间是 O(N * N) ,因为每个 N 步骤都是搜索问题,即 O(N) .

    当你找到第一个K元素时,你可以停下来 . 如果你提前中止它,那就不再是N步了;但每一步都没有改变 .

    所以大O.

    因此,中止选择排序的>是O(K * N) .

    堆排序分两步完成:heapify和siftdown . 必须正确完成Heapify(创建堆结构),它将保持不变 . 由于它在比siftdown更少的操作中执行,因此从heap sort的big-O中省略了它 .

    Siftdown(将堆中的元素交换为排序数组)与选择排序非常非常相似,但是在每个 N 步骤中执行以查找下一个最高元素的操作更快: O(log N) .

    由于siftdown几乎完全相同,从概念上讲,作为选择排序,你可以在发现前K个结果的同时中止它 .

    这意味着大O.

    因此,中止堆排序的>是O(K * log N) .

相关问题