排序算法 稳定和不稳定
最近在一次采访中,在对排序算法提出了一些最初的问题(例如,您如何编写QuickSort或QuickSort与MergeSort之间的区别)之后,访问者问您是否了解稳定和不稳定的排序算法之间的区别? 这个问题对我的读者来说是新问题,所以他说,对不起,从未听说过。 故事到此结束,采访者继续讨论下一个问题,但是像我们许多人一样,我的读者继续查找有关未回答问题的更多信息,最终他问我稳定和不稳定排序算法的含义是什么? 可能有人对此有所耳闻,许多人可能不知道这种区别,我将在本文中尝试回答这个问题。
如果在平局的情况下,排序算法保持数字/记录的相对顺序,则该排序算法被称为稳定 ,即,如果您需要排序1 1 2 3,那么如果您不更改前两个排序的顺序,则算法是稳定的稳定,但是如果交换它们,则尽管总体结果或排序顺序保持不变,但它仍然不稳定。
当您对对象进行排序(例如, 按键对键值对进行排序)时,这种区别变得更加明显。 在稳定算法的情况下,键值对的原始顺序将保留,如下例所示。
实际上,如果您忘记提及这些概念,则Interviewer可能会问这个问题,作为quicksort与merge sort的跟进。 quicksort和mergesort之间的主要区别之一是以前是不稳定的,但是merge sort是稳定的排序算法。
稳定与不稳定算法
假设您需要按照键的升序对以下键值对进行排序:
INPUT: (4,5), (3, 2) (4, 3) (5,4) (6,4)
现在,对于两个相同的**对,有两种可能的解决方案,即(4,5)和(4,3),如下所示:
OUTPUT1: (3, 2), (4, 5), (4,3), (5,4), (6,4)
OUTPUT2: (3, 2), (4, 3), (4,5), (5,4), (6,4)
将产生第一个输出的排序算法称为稳定排序算法,因为保持了相等键的原始顺序,您可以看到(4,5)在(4,3)之前在排序顺序中,这是原始顺序,即在给定的输入中,(4,5)在(4,3)之前。
另一方面,产生第二个输出的算法将被称为不稳定的排序算法,因为具有相同键的对象的顺序不会保持在排序顺序中。 您可以看到在第二个输出中,(4,3)在(4,5)之前,而在原始输入中则不是。
现在,最大的问题是稳定和不稳定排序算法的一些示例是什么? 好吧,您可以将所有众所周知的排序算法分为已排序和未排序。 稳定算法的一些示例包括合并排序, 插入排序 , 冒泡排序和二叉树排序。 而QuickSort ,Heap Sort和Selection排序是不稳定的排序算法。
如果您还记得,Java Collection框架的Collections.sort()方法使用迭代合并排序,这是一种稳定的算法。 如果输入数组被部分排序,它的比较也比NLog(N)少得多。
如果您有兴趣学习有关此主题的更多信息,建议您阅读一本关于数据结构和算法的好书,例如Thomas H. Cormen的算法介绍 。
据说一张图片的价值超过1000个单词,所以让我们看一张图片,它说明稳定和不稳定排序的工作方式:
这就是稳定排序算法和不稳定排序算法之间的区别 。 请记住,如果在排序的输出中保留了相同的键或数字的原始顺序,则该算法称为排序算法。 稳定排序算法的一些流行示例是合并排序,插入排序和冒泡排序。
进一步阅读
感谢您阅读本文。 如果您喜欢这个面试问题和我的解释,请与您的朋友和同事分享。 如果您有任何问题或反馈,请发表评论。
翻译自: https://www.javacodegeeks.com/2017/06/difference-stable-unstable-sorting-algorithm.html
排序算法 稳定和不稳定