Questions tagged «sorting»

有关排序算法及其速度和复杂性的问题。

2
排序算法“稳定”是什么意思?
在阅读有关各种排序算法的文章时,我已经看到它提到有些是“稳定的”,有些不是。这是什么意思,选择算法时要在此基础上进行哪些权衡?
43 sorting 

6
我想编写一个“最终洗牌”算法来对我的mp3集合进行排序
我正在寻找伪代码建议,以避免标题和艺术家重复的方式对mp3文件进行排序。我听低吟的歌手-弗兰克·辛纳屈(Frank Sinatra),托尼·贝内特(Tony Bennett),埃拉·菲茨杰拉德(Ella Fitzgerald)等歌唱旧唱片。每位歌手都录制许多相同的歌曲-《飞向月球》,《今夜的样子》,《星尘》等。我的目标是安排歌曲(或订购播放列表),并在歌手和歌曲名称之间留出最大的空间。因此,如果我有2000首歌曲,而Ella有20首,我想每100首歌曲只听一次她。如果有10位歌手演唱《飞向月球》,我希望每200首歌曲中听到一次。当然,我想结合这两个要求来创建我的“最终洗牌”。 我知道这是一个相当广泛的问题。我尚未开始对其进行编程,因此我只是在寻找采用一种好的方法的建议。关于均匀间隔其他歌曲属性,我实际上还有一些其他要求,但这里不再赘述。 首先,我正在修改在这里找到的代码,以处理mp3文件和读取ID3标签。 我编写了一个小应用程序,使用下面的parsifal回答可以满足我的需求。我还在这里写了一个后续问题。感谢您的所有好评!


4
为什么某些排序方法按1、10、2、3…排序?
我注意到,有很多数字排序方法似乎按1、10、2、3 ...排序,而不是预期的1、2、3、10...。需要第一种方法,并且作为用户,只要在实践中看到它,我都会感到沮丧。第一种样式是否有合理的用例?如果是这样,它们是什么?如果没有,那么第一类样式是如何形成的?每种排序方法的正式名称是什么?
30 sorting 

14
您知道最模糊的排序算法是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我刚刚通过sortvis.org博客文章阅读了有关cyclesort的文章。这可能是迄今为止我所听说过的最晦涩的一种语言,因为它使用的是我不熟悉的数学(检测整数集置换中的周期)。 您所知道的最晦涩的是什么?

3
如何在关系数据库中存储订购的信息
我正在尝试了解如何在关系数据库中正确存储有序信息。 一个例子: 假设我有一个由歌曲组成的播放列表。在我的关系数据库中,我有一个的表Playlists,其中包含一些元数据(名称,创建者等)。我还有一个名为的表Songs,其中包含playlist_id和特定于歌曲的信息(名称,艺术家,时长等)。 默认情况下,将新歌曲添加到播放列表时,它将添加到末尾。按Song-ID(升序)订购时,该顺序将为添加顺序。但是,如果用户应该能够对播放列表中的歌曲重新排序,该怎么办? 我提出了一些想法,每个想法都有其优点和缺点: 称为的列order,它是整数。移动歌曲时,所有歌曲在其旧位置和新位置之间的顺序都会更改,以反映更改。这样做的缺点是,每次移动歌曲时都需要进行很多查询,并且移动算法不像其他选项那样琐碎。 称为的列order,它是一个十进制(NUMERIC)。移动歌曲时,会为其分配两个相邻数字之间的浮点值。缺点:十进制字段会占用更多空间,并且可能会精度不够,除非在每次更改后都注意重新分配范围。 另一种方法是使用previous和next字段引用其他歌曲。(或者,如果现在是播放列表中的第一首和最后一首歌曲,则为NULL;基本上,您将创建一个链表)。缺点:诸如“在列表中找到第X首歌曲”之类的查询不再是固定时间,而是线性时间。 在实践中最常使用以下哪个程序?在大中型数据库上,以下哪个过程最快?还有其他方法可以存档吗? 编辑:为简单起见,在此示例中,一首歌曲仅属于一个播放列表(多对一关系)。当然,也可以使用Junction Table,因此song⟷playlist是一个多对多关系(并在该表上应用上述策略之一)。

8
为什么将需要排序数据的二进制搜索比线性搜索更好?
我一直听说线性搜索是一种幼稚的方法,并且由于渐近复杂性的提高,二进制搜索的性能要优于线性搜索。但是我从来不明白为什么在二进制搜索之前需要排序时,为什么它比线性搜索更好? 线性搜索为O(n),二进制搜索为O(log n)。这似乎是说二进制搜索更好的基础。但是二进制搜索需要O(n log n)对最佳算法进行排序。因此,二进制搜索实际上不应该更快,因为它需要排序。 我正在阅读CLRS,作者在其中表示,在插入排序中而不是使用朴素的线性搜索方法,最好使用二进制搜索来查找必须插入项目的位置。在这种情况下,这似乎是合理的,因为在每次循环迭代时,都有一个可以应用二分查找的排序列表。但是在通常情况下,对于不能保证我们需要搜索的数据集,由于排序要求,使用二进制搜索实际上并不比线性搜索差吗? 我是否忽略了使二进制搜索比线性搜索更好的实际考虑因素?还是不考虑排序所需的计算时间而认为二进制搜索比线性搜索更好?

3
Java和.NET:为什么默认情况下使用不同的排序算法?
只是想知道为什么,Java并且.NET Framework默认情况下使用不同的排序算法。 在Java中 ,默认情况下Array.Sort()使用合并排序算法,如Wikipedia.com所述: 在Java中,Arrays.sort()方法根据数据类型使用合并排序或调整后的快速排序,当排序少于七个数组元素时,为了实现转换为插入排序的实现效率 在.NET Framework中, Array.Sort/List.Sort()使用“ 快速排序”作为默认排序算法(MSDN): List.Sort()使用Array.Sort,后者使用QuickSort算法。此实现执行不稳定的排序;也就是说,如果两个元素相等,则可能不会保留其顺序。相反,稳定排序保留了元素相等的顺序。 通过查看出色的“算法比较”表,我们可以发现两种算法在最坏情况和内存使用情况方面的行为都大不相同: 这两个Java和.NET是企业解决方案发展的巨大框架,既有嵌入式开发平台。那么为什么他们默认使用不同的排序算法,有什么想法呢?

5
算法复习。为什么heapsort是insort算法?
我看不到为什么heapsort被认为是就地排序算法。 我的意思是用要排序的数组元素(即堆)填充的额外数据结构用于协助提取最小值和排序过程。 那么我可能误解了inplace的定义吗? 但是,例如,插入排序显然是就地算法,即元素不需要额外的内存。 那么为什么要考虑到它呢?

2
试图了解2N lnN与Quicksort的比较
我正在对Sedgewick的Algorithms一书中的quicksort进行分析。他为quicksort中的比较数创建了以下递归关系,同时对N个不同项目的数组进行了排序。 我很难理解这一点...我知道任何元素成为枢轴都需要1 / N的概率,并且如果k成为枢轴,那么左子数组将具有k-1个元素,而右子数组数组将包含Nk个元素。 1.分区成本如何变为N + 1?做分区需要N + 1比较吗? 2.Sedgewick说,对于k的每个值,如果将它们相加,则划分元素为k的概率+两个子数组的成本,您将得到上述方程式。 有人可以解释一下,以便那些数学知识(我)较少的人可以理解吗? 具体来说,您如何获得方程式中的第二项? 这个词到底代表什么?

2
Java为什么不对基元使用基数排序?
java.util.Arrays.sort(/* int[], char[], short[], byte[], boolean[] */) 被实现为“优化的快速排序”,而不是基数排序。 我前一阵子做了速度比较,使用n> 10000之类的东西,基数排序总是更快。为什么?
12 java  sorting 

7
处理大量数据的排序算法
我正在寻找一种排序算法,该算法可以处理大量数据,即,即使整个数据集无法一次保存在主存储器中,也可以使用。 我到目前为止发现的唯一候选对象是合并排序:您可以以这种方式实现该算法,即它在每次合并时都扫描您的数据集,而无需一次将所有数据保存在主存储器中。在本文的“ 与磁带机一起使用”部分中介绍了我想到的合并排序方式。 我认为这是一个很好的解决方案(复杂度为O(nx log(n)),但是我很想知道是否还有其他(可能更快)的排序算法可以处理不适合主内存的大型数据集。 编辑 这是答案所要求的更多详细信息: 数据需要定期分类,例如每月一次。我不需要插入一些记录,也不需要对数据进行递增排序。 我的示例文本文件大约是1 GB UTF-8文本,但是我想总体上解决该问题,即使该文件是20 GB。 它不在数据库中,并且由于其他限制,它不能在数据库中。 数据被其他人作为文本文件转储,我有自己的代码读取此文本文件。 数据的格式是文本文件:换行符是记录分隔符。 我想到的一种可能的改进是将文件拆分为足够小的文件,以便可以在内存中排序,最后使用上面描述的算法合并所有这些文件。

2
IComparable接口是否过时/“有害”?
IComparable 仅以一种方式工作 假设您有一Employee堂课。在一个视图中,您要显示所有Employees按名称排序的视图-在另一个视图中按地址显示。您将如何实现?不使用IComparable,至少不是以任何惯用的方式。 IComparable 逻辑错误 通过调用使用该接口.Sort()。在显示Customer按名称排序的视图中,根本没有代码暗示如何进行排序。 另一方面,Customer该类假设如何使用它-在这种情况下,它将在按名称排序的列表中使用。 IComparable 隐式使用 与替代方案相比,很难看到在何处使用了比较逻辑,或者根本看不到。假设您使用标准IDE,并从Customer课堂开始,我将不得不 搜索所有引用 Customer 查找列表中使用的那些引用 检查这些列表是否曾经拜访过.Sort()它们 更糟的是,如果删除IComparable仍在使用的实现,则不会收到任何错误或警告。您将得到的唯一一件事就是在所有难以理解的地方出现错误的行为。 这些问题加在一起,加上需求不断变化 我之所以开始考虑这一点,是因为它对我来说是错的。我已经IComparable在我的应用程序中愉快地使用了两年了。现在,需求发生了变化,事物需要以两种不同的方式进行分类。已经注意到,遍历上一节中描述的步骤并不是一件有趣的事情。 问题 这些问题使我认为IComparable不如IComparer或.OrderBy(),以至于看不到任何其他替代方案无法更好地解决的有效用例。 使用IComparer或LINQ 总是更好吗,还是这里没有我看到的优点/用例?
11 c#  sorting  comparison 

2
是什么造成快速分类的坏情况?
我正在学习quicksort,并想说明quicksort很难解决的各种数组。我想到的快速排序没有初始随机改组,没有2分区,并且不计算中位数。 到目前为止,我想到了三个示例: [1,2,3,4,5,6,7,8,9,10] - when the array is sorted [10,9,8,7,6,5,4,3,2,1] - when the array is reversed [1,1,1,1,1,1,1,1,1,1] - when the array is the same values [1,1,1,2,2,2,3,3,3,3] - when there are few and unique keys 例如,我对此不太确定: [1,3,5,7,9,10,8,6,4,2] 那么,为什么快速排序的阵列与(几乎)理想的阵列相比有什么困难呢?

4
在Java中分割定界字符串的最快方法
我正在构建一个在分隔字符串上提供多列排序功能的比较器。我目前使用String类的split方法作为将原始String拆分为标记的首选。 这是将原始String转换为String数组的最佳方法吗?我将对数百万行进行排序,因此我认为方法很重要。 它似乎运行良好并且非常简单,但是不确定Java中是否有更快的方法。 这是我的比较器中排序方式的工作方式: public int compare(String a, String b) { String[] aValues = a.split(_delimiter, _columnComparators.length); String[] bValues = b.split(_delimiter, _columnComparators.length); int result = 0; for( int index : _sortColumnIndices ) { result = _columnComparators[index].compare(aValues[index], bValues[index]); if(result != 0){ break; } } return result; } 在对各种方法进行基准测试之后,不管您信不信,使用最新版本的Java最快的方法是split方法。您可以在这里下载我完成的比较器:https : //sourceforge.net/projects/multicolumnrowcomparator/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.