最近做面试题中,遇到一些平时学习中比较少注意到的问题,记录下来以便后来者学习讨论。
对 堆排序 不熟悉的 可以参考 【基础算法】细说十大排序!
既然要讨论快速排序为什么不稳定,那么也应该明确什么是稳定性!
通常,在排序算法中,稳定性
是指如果两个元素在原始数组中的相对顺序保持不变,则在排序后它们的相对顺序也应该保持不变。
换句话说,如果有两个相等的元素,它们的位置在排序之前是 a 和 b,且 a 在 b 的前面,那么在排序后,a 仍然应该在 b 的前面。
1、在建堆阶段,首先将待排序的元素构建成一个堆(大顶堆或小顶堆)。从最后一个非叶子节点开始,逐步向上调整,使得每个节点都满足堆的性质。在调整的过程中,可能需要交换节点的位置来满足堆的性质。这个交换操作会改变相同键值元素的相对顺序,从而导致排序的不稳定性。
2、在排序阶段,每次从堆顶取出最大(或最小)元素,将其放到已排序部分的末尾,然后对剩余未排序的部分进行堆调整,重复这个过程直到所有元素都被放置到正确的位置上。这个过程中同样会涉及交换操作,进一步破坏了相同键值元素的相对顺序,导致排序的不稳定性。
总结起来,堆排序是通过反复调整元素位置来完成排序的过程,其中涉及到交换操作。这些交换操作可能导致相同键值元素的相对顺序发生变化,因此堆排序是一个不稳定的排序算法。如果希望实现稳定性排序,可以选择其他稳定的排序算法,如冒泡排序、插入排序或归并排序。