【问题标题】:K largest elements of an array, sorting algorithm数组的K个最大元素,排序算法
【发布时间】:2016-11-09 01:09:43
【问题描述】:

我一直被这个问题困扰,希望有人能给出答案并解释一下。

给你一个无重复元素的未排序整数数组 A,并要求你找到第 K 个 降序排列的最大元素。例如,如果 A 是数组 [11,6,1,2,15,7,4,8,20] 和 K = 3,那么答案应该是 [20,15,11]。描述如何修改选择排序和 heapsort 来解决这个问题(两个单独的答案)。您的最坏情况下运行时间是多少 算法,作为 N = A.length 和 K 的函数?

【问题讨论】:

    标签: arrays algorithm sorting


    【解决方案1】:

    选择排序通常做什么:

    • 找到最高元素,换到第一位
    • 找到下一个最高的元素,换到第二位
    • ...
    • 查找倒数第二个元素,交换到倒数第二个位置
    • 完成。

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

    您可以在找到前 K 个元素时停止。如果你提前中止它,它就不再是N 步骤了;但每一步都是不变的。

    所以大O

    因此,中止选择排序的

    O(K * N)

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

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

    由于 siftdown 与选择排序在概念上做的事情几乎相同,因此您可以在它找到顶部的 K 结果后立即中止它。

    这意味着大O

    因此,中止堆排序的

    O(K * log N)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      相关资源
      最近更新 更多