Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为什么是“一个”呢;“不稳定排序”;被认为是坏的_Algorithm_Sorting_Computer Science_Theory - Fatal编程技术网

Algorithm 为什么是“一个”呢;“不稳定排序”;被认为是坏的

Algorithm 为什么是“一个”呢;“不稳定排序”;被认为是坏的,algorithm,sorting,computer-science,theory,Algorithm,Sorting,Computer Science,Theory,只是想知道是否有人能解释为什么“不稳定类型”被认为是不好的?基本上,我看不出任何情况下这真的很重要。有人愿意提供一张吗?想象一下,你想组织一副牌。您可以先按西装排序,然后按数值排序。如果你使用稳定排序,你就完了。如果使用不稳定排序,则它们将按数字顺序排列,但西装将再次被弄乱。在实际的开发问题中会出现很多类似的情况。只有少数情况需要稳定的排序算法。这方面的一个例子是,如果您正在实现基数排序,这取决于用作构建块的比较排序算法是稳定的。(基数排序可以在线性时间内操作,但它的输入比比较排序算法更受限制。

只是想知道是否有人能解释为什么“不稳定类型”被认为是不好的?基本上,我看不出任何情况下这真的很重要。有人愿意提供一张吗?

想象一下,你想组织一副牌。您可以先按西装排序,然后按数值排序。如果你使用稳定排序,你就完了。如果使用不稳定排序,则它们将按数字顺序排列,但西装将再次被弄乱。在实际的开发问题中会出现很多类似的情况。

只有少数情况需要稳定的排序算法。这方面的一个例子是,如果您正在实现基数排序,这取决于用作构建块的比较排序算法是稳定的。(基数排序可以在线性时间内操作,但它的输入比比较排序算法更受限制。(比较排序需要O(n lgn)时间)


不稳定的种类不一定是“坏的”;更重要的是,稳定的排序“在某些情况下是可取的”。这就是为什么编程语言,例如C++的标准模板库,同时提供了这两种语言——例如
std::sort
std::stable_sort
——它们允许您指定何时需要稳定性,何时不需要稳定性。

,因为它们可以比我做得更好……从:

有两种类型 算法:“稳定排序”和 “不稳定的种类”。这些术语指的是 当两个 值比较为相等。如果你有 带有两个元素Tn的数组T0..size Tk表示n 请注意,像快速排序这样的排序算法并不稳定或不稳定。实现将决定它是哪个


在任何情况下,稳定并不一定比不稳定好或坏——只是有时候你需要保证两个相等元素的顺序。当您确实需要这种保证时,不稳定将不合适。

如果您有一个GUI,允许人们通过单击该列对各个列进行排序,并且您使用稳定排序,那么知道的人可以通过按顺序单击列C、B、a,对列a、B、C进行多列排序。由于排序是稳定的,当您单击B时,B下具有相等键的任何记录仍将按C排序,因此单击B后,记录将按B,C排序。同样,单击A后,记录将按A,B,C排序


(不幸的是,上次我在某些Microsoft产品或其他产品上尝试此功能时,它似乎没有使用稳定排序,因此这一技巧不为人所知也就不足为奇了)。

我认为这不是一个很好的比较,因为在任何比较函数中都应该同时考虑西装和号码。还要注意的是,如果你要使用一种稳定的排序方法,你必须先按数字排序,然后再根据需要进行排序,但不能用另一种方法。首先,你需要一个比较函数,当且仅当你没有一个稳定的排序时,把这两件事都考虑进去。否则,您可以拥有一个简单的比较函数,在动态语言中,该函数可以被编写为按名称按属性排序。第二,你似乎觉得只有一种方法可以组织一副牌。我向你保证,“组织”可以用多种方式解释。谁认为它“不好”?你有引用、参考或链接吗?这将有助于为这种价值判断提供一些背景。可能的重复我认为OP理解这两种类型之间的区别。他在问为什么一个不稳定的排序是“坏的”——这意味着他知道是什么使排序不稳定。@Billy-非常正确。我想,为了得到更好的答案,我想解释一下它是什么,这样我就可以说我的最后一段了——除了在特定的情况下,第一段不一定是“坏”或“好”的。很好的例子。但是你的意思是说微软的产品不稳定吗?令人震惊!:)很高兴我读到了这个。我没有想到这样的事情不会使用可靠的排序。但是,不稳定的排序不能通过添加rownum/索引或其他类型的唯一计数器作为复合排序键中的最后一个元素来保持稳定吗?除非我遗漏了一些东西,否则添加这些看起来很简单。@drake7707您确实可以通过这种方式从不稳定排序创建稳定排序。如果在编写排序API时始终牢记此用例,并且GUI始终使用此用例为用户提供稳定的排序,那就太好了。唉,这种情况并不总是发生。不知道是谁投了反对票,但我猜他们会发现你使用稳定排序执行另一种排序的例子有点非典型。“这取决于用作构建块的基于比较的排序算法是稳定的”——你在说什么?基数排序的“构建块”是什么?为什么它需要稳定?不管这是否真的有意义,排序并不是为什么在某些情况下需要稳定排序的好例子。@Dukeling:因为基数排序将每个数字按一个数字进行排序(由基数分隔的数字,因此是基数排序),并且依赖于基础排序的稳定性来实现正确的行为。(否则,按一个数字排序可能会破坏对另一个数字排序的结果)至于“不是一个好例子”,你有权发表你的意见。哦,对了,你提到基于比较的排序可能会让我有点困惑。建议使用桶排序或计数排序,这两种排序都不是基于比较的。+1奇怪的是,当被接受的答案只是一个实数时,基数排序的示例被降票