【问题标题】:Sorting an array of integers using algorithm with complexity O(n)使用复杂度 O(n) 的算法对整数数组进行排序
【发布时间】:2014-12-07 20:39:43
【问题描述】:

我已经注意到最好的排序比较算法的复杂度为 O(nlog(n))。但是我被要求使用复杂度 O(n) 的排序算法对整数数组(在 C 中)进行排序,因为 数组中的所有元素都是非负数且小于常数 K .但我不知道如何在排序算法中使用这些信息。你们有什么想法吗?

【问题讨论】:

  • 基数排序并不“经常”(或曾经)具有复杂性O(n log n)
  • 排序算法基于成对比较的时间复杂度的理论下限为 O(n log(n))。不基于对要排序的元素进行成对比较的算法可能会接近 O(n)。

标签: c arrays sorting


【解决方案1】:

这是一个简单的例子(称为"counting sort" 或“直方图排序”,"bucket sort" 的简并情况):

  1. 为每个小于k 的非负整数分配一个具有一个槽的数组,并将其归零。 O(k)
  2. 遍历输入的所有元素并将它们计数到我们的数组中。 O(n)
  3. 遍历我们的数组并按顺序写出元素。 O(n+k)

因此,O(n+k)

【讨论】:

  • 如果步骤 2. 是 O(n),读取 n 个元素并将 k 个元素的数组递增(读取 + 写入)n 次,那么步骤 3 也不会是 O(n),读取并将 k 个元素的数组递减 n 次并写入 n 个元素?
  • @rcgldr:在第 2 步中,我们遍历输入数组(长度为 n)一次,并对每个数组执行相同的简单操作。因此,O(n)。在第 3 步中,我们迭代我们的边数组(长度 k),在这个过程中准确地写入我们的输出数组 n 次,所以 O(iter+write) == O(k+n)。
【解决方案2】:

基数排序给你 O(n log k),而不是 O(n log n) 复杂度。由于 K 是与 n 无关的固定数,因此结果复杂度为 O(n * const),即它是线性的。

【讨论】:

    【解决方案3】:

    创建一个大小为 K 的新数组,并将每个元素插入到数组中自己的位置..

    假设 K=100

    创建一个包含 100 个整数的数组 - 清除它。 如果你有集合 {55, 2, 7, 34}。 您只需要以下内容:

    array[55] = 1;
    array[2] = 1;
    array[7] = 1;
    array[34] =1;
    

    然后从头到尾遍历数组,只打印 == 1 的单元格的索引

    【讨论】:

      【解决方案4】:

      取决于复杂程度。平均情况 O(n+k):Bucket Sort.

      基数排序应该是 O(m * n)。 (m 是用于排序的键的长度)

      【讨论】:

      • 如果 K 是最大数(而不是位数),那么基数排序是 O(n log K),而不是 O(nK)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      相关资源
      最近更新 更多