稳定的排序算法:直接插入排序、冒泡排序、归并排序
不稳定的排序算法:希尔排序、快速排序、简单选择排序、堆排序
Q:为什么直接插入排序稳定?
A:因为每加入一个新的数都要把它和前面排好序的最后一位对比,比它大则直接放后面;比它小则往前插入;如果遇到相等的,就不往前插了,直接放后面,这样可以确保相同值相对顺序不变。因此是稳定的。
Q:为什么冒泡排序稳定?
A:每一次的比较都是前一个数与后一个数比较,如果前面的数大于后面的数则二者交换位置;如果前面的数小于后面的数,则不动,跳过当前位置,继续比较下一个数与其后面的数;如果前面的数和后面的数相等,则与小于的情况做同样的操作,这样一来就可以确保相同值相对顺序不变。因此是稳定的。
Q:为什么归并排序稳定?
A:归并是把问题划分为多个小规模问题,将小规模问题解决完之后,再做合并操作。比如将两个已经排好序的子序列做合并操作,此时如果有相同的值分别存在于两个子序列中,我们可以先将左边数组中的数插入到临时数组中,再将右边数组的数插入到临时数组中。这样一来就可以确保相同值相对顺序不变。因此是稳定的。
Q:为什么简单选择排序不稳定?
A:比如对于数组[5,5,5,3,7,1]来说,3比5小,我们把二者交换位置之后,第一个5就跑到了3的位置,这样一来,第一个5就跑到了第二、三个5的后面了,相对顺序变了,因此不稳定。
Q:为什么堆排序不稳定?
A:比如对于[3,4,4,5]这样的一棵树来说,在构建大顶堆的过程中,会将5这个节点与它的父节点交换位置,变成[3,5,4,4],这样一来,第一个4就跑到了第二个4的后面,相对顺序变了,因此不稳定。