什么是就地排序?
使用恒定的额外空间来产生输出,仅修改给定的数组,如:插入排序和选择排序。他们不使用任何额外的空间。而归并排序和计数排序就不是就地排序。
什么是内部排序和外部你排序?
当所有待排序记录不能被一次载入内存进行处理时,这样的排序就被称为外部排序。外部排序通常应用在待排序记录的数量非常大的时候。归并排序以及它的变体都是典型的外部排序算法。外部排序通常与硬盘、CD等外部存储器(辅存)关联在一起。
当所有待排序记录可以一次载入内存时,则称为内部排序。
什么是稳定排序?
如果两个具有相等关键字的对象在排序前后的相对位置没有发生变化,则认为排序算法是稳定的。
换种说法:排序前后序列中键值相等的元素的相对位置没有发生变化的就是稳定排序。
排序仅关心像整数数组这样的简单数组?
当然不是,如果仅仅是对这样的数组进行排序,那么排序算法的稳定性倒也无足轻重。但是我们实际接触的排序,比如对一个“学生”数组,每一个“学生”对象又拥有很多个属性,那么我们可以先对属性A排序,再对属性B排序,这个时候,排序的稳定性就显得尤为重要了。
哪些是稳定排序?哪些不是?
冒泡排序(Bubble Sort)、插入排序(Insertion Sort)、归并排序(Merge Sort)和计数排序(Counting Sort)等本身就具有稳定排序的特质。
基于比较的排序算法,例如归并排序和插入排序,他们是如何保证稳定性的呢?
快速排序(Quick Sort)和 堆排序(Heap Sort)等就是不稳定的排序算法,但是这些排序算法可以通过将元素的相对次序考虑进来而变得稳定,方法就是空间换时间,开辟一些额外的空间(大概 O(n) ) 以实现稳定性。
是否可以使任何排序算法都变得稳定呢?
答案是肯定的。任何排序算法都可以通过指定的方式变得稳定,可以通过修改键值的比较操作将本质上不稳定的任何基于比较的排序算法修改为稳定,保证键值相等的两个元素在排序前后的相对位置不变。
参考资料
来源于公众号“景禹”,作者“景禹”,文章名字《面试官问你排序算法最基础的这几问,把这篇文章扔给他》