C 有效分类

C 有效分类,c,algorithm,sorting,C,Algorithm,Sorting,我有一个值数组,几乎是,但不完全排序,有几个值被替换(比如,100000中有50个)。如何最有效地排序?我的第一个直觉是识别放错位置的元素并将它们移动到一个单独的数组中,在那里用你喜欢的任何算法对它们进行排序(用那几个,应该没关系),然后将它们合并并重新排序。使用;对于几乎已排序的数组来说,这非常好,因为它们已经接近O(n)时间了。实际上,我相信.NET Framework在内部使用插入排序对枚举值进行排序(因为它们经常被排序),不过我必须重新检查这一点。在假设数组几乎已排序的情况下,您可以使用

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

我的第一个直觉是识别放错位置的元素并将它们移动到一个单独的数组中,在那里用你喜欢的任何算法对它们进行排序(用那几个,应该没关系),然后将它们合并并重新排序。

使用;对于几乎已排序的数组来说,这非常好,因为它们已经接近O(n)时间了。实际上,我相信.NET Framework在内部使用插入排序对枚举值进行排序(因为它们经常被排序),不过我必须重新检查这一点。

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

Wiki甚至有一个java实现。因为你不能比O(n)快(因为要知道一个数组是否被排序要花很多时间),所以smoothsort是一个不错的选择。更多细节

smoothsort的优点是 如果输入 已经在某种程度上进行了分类

大城市鸡尾酒种类的复杂性 O表示法是O(n2),表示两种最坏的情况 案例和一般案例,但它 如果列表为,则变得更接近O(n) 大部分是在申请前订购的 排序算法


Java的数组实际上现在在Java7中使用timsort来对对象进行排序(
sort()
)。timsort说明。

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

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

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


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


因此,请阅读您的libc文档,或者更好地检查它是如何实现排序的(如果您有权访问源代码的话),因为有时这是一个未在文档中列出的实现细节

您可以在标记中添加“算法”。也许他们也能帮上忙。你的价值观是什么?简单整数或浮点数,还是结构?你衡量效率的标准是什么?空间时间?老兄,你真的需要回去回顾你的问题并接受一些。据我所知,找出数组中未排序的“程度”(以及由此产生的“错位”元素)实际上很难。。。你知道有什么好的算法吗?请提出一个算法来找到你所谓的“错位元素”。谢谢。