Dar*_*der 236 language-agnostic sorting algorithm stability
我很好奇,为什么稳定性在排序算法中是否重要?
Joe*_*ams 306
如果具有相等键的两个对象在排序输出中以与要排序的输入数组中出现的顺序相同的顺序出现,则称排序算法是稳定的.一些排序算法本质上是稳定的,如插入排序,合并排序,冒泡排序等.并且一些排序算法不是,如堆排序,快速排序等.
背景:"稳定"排序算法按顺序保存具有相同排序键的项目.假设我们有一个5个字母的单词列表:
peach
straw
apple
spork
Run Code Online (Sandbox Code Playgroud)
如果我们只按每个单词的第一个字母对列表进行排序,那么稳定排序会产生:
apple
peach
straw
spork
Run Code Online (Sandbox Code Playgroud)
在一个不稳定的排序算法,straw
或者spork
可以互换,但在稳定的一个,它们留在相同的相对位置(即,由于straw
前出现spork
在输入,它也出现之前spork
在输出).
我们可以使用这个算法对单词列表进行排序:第5列,然后是4,然后是3,然后是2,然后是1的稳定排序.最后,它将被正确排序.说服自己.(顺便说一句,该算法称为基数排序)
现在回答你的问题,假设我们有一个名字和姓氏的列表.我们被要求"按姓氏排序,然后先排序".我们可以先按名字排序(稳定或不稳定),然后按姓氏进行稳定排序.在这些排序之后,列表主要按姓氏排序.但是,如果姓氏相同,则对名字进行排序.
您不能以相同的方式堆叠不稳定的排序.
snr*_*snr 42
一个稳定的排序算法是按照输入中出现的相同顺序对相同元素进行排序,而不稳定排序可能不满足这种情况.
稳定的排序算法:
不稳定的排序算法:
Bob*_*phy 18
排序稳定性意味着具有相同键的记录在排序之前和之后保持其相对顺序.
因此,只有当您正在解决的问题需要保留相对顺序时,稳定才有意义.
如果你不需要稳定性,你可以使用库中的快速,内存啜饮算法,比如heapsort或quicksort,并忘记它.
如果你需要稳定性,那就更复杂了.稳定算法比不稳定算法具有更高的大O CPU和/或内存使用率.因此,当您拥有大型数据集时,您必须在击败CPU或内存之间进行选择.如果你受到CPU和内存的限制,那就有问题了.一个好的折衷稳定算法是二叉树排序; 在维基百科的文章具有基于STL一个可怜容易C++实现.
您可以通过将原始记录号添加为每个记录的最后一个键来将不稳定算法变为稳定算法.
sve*_*ens 14
这取决于你做了什么.
想象一下,你有一些带有名字和姓氏字段的人物记录.首先,按名字对列表进行排序.如果您使用按姓氏的稳定算法对列表进行排序,则您将拥有按名字和姓氏排序的列表.