【问题标题】:sorting efficiently高效分拣
【发布时间】:2011-05-25 17:45:31
【问题描述】:

我有一个值数组,这些值几乎是排序的,但没有完全排序,有一些值被替换(例如,100000 中有 50 个)。如何最有效地排序?

【问题讨论】:

  • 您可以在标签中添加“算法”。也许他们也可以提供帮助。
  • 你的价值观是什么?简单的整数或浮点数,或结构?你衡量效率的标准是什么?空间 ?时间?
  • 老兄,你真的需要回去检查你的问题并接受一些。

标签: c algorithm sorting


【解决方案1】:

如今,大多数 libc 实现提供的 qsortmergesort 函数已经有效地处理了这种特殊情况。

因此,请阅读您的 libc 文档,甚至更好地检查它是如何实现排序的(如果您可以访问源代码),因为有时这是文档中没有列出的实现细节!

【讨论】:

    【解决方案2】:

    找到最佳排序算法取决于您对数据的控制程度。

    排序算法分为插入、交换、选择、合并等方法。这意味着如果你可以控制在数组上插入新数据的机制,你就可以在这样做的同时对它们进行排序。如果你只能在数据存在之后才能对数组进行排序,那么最好的算法就是另一种完全不同的算法。

    无论如何,这些都是有趣的读物:

    http://en.wikipedia.org/wiki/Sorting_algorithm

    what-should-students-be-taught-first-when-first-learning-sorting-algorithms

    comparison-of-sorting-algorithms

    what-is-the-fastest-sorting-algorithm-in-c

    【讨论】:

      【解决方案3】:

      假设数组几乎已排序,您可以使用以下方法之一:

      Smoothsort

      Wiki 上甚至有一个 java 实现。由于你不能比 O(n) 更快地完成它(因为它甚至需要花费很多时间才能确定数组是否已排序)smoothsort 是一个不错的选择。更多详情here.

      smoothsort 的优点是它 如果输入更接近 O(n) 时间 已经在某种程度上排序了

      Coctail sort

      鸡尾酒排序的复杂性 O 表示法是 O(n2) 最坏的 案例和平均案例,但它 如果列表是,则变得更接近 O(n) 大多是在申请之前订购的 排序算法,

      Timsort

      Java 的数组实际上现在在 java 7 中使用 timsort 来对对象进行排序 (sort())。 timsorthere的描述。

      【讨论】:

        【解决方案4】:

        使用insertion sort;几乎排序的数组非常棒,因为它们的时间接近 O(n)。我实际上相信 .NET Framework 使用插入排序在内部对枚举值进行排序(因为它们经常被排序),尽管我必须重新检查。

        【讨论】:

          【解决方案5】:

          我的第一个直觉是识别放错位置的元素并将它们移动到一个单独的数组中,使用您喜欢的任何算法对它们进行排序(使用少数算法,这无关紧要),然后将它们合并排序。

          【讨论】:

          • 找出数组中未排序的“程度”(以及因此的“错位”元素)实际上很难,据我所知......你知道有什么好的算法吗?那个?
          • 请提出一种算法来查找您所谓的“错位元素”。谢谢。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-07-20
          • 2016-01-13
          • 2018-04-21
          • 1970-01-01
          • 1970-01-01
          • 2012-07-13
          相关资源
          最近更新 更多