时间复杂度和空间复杂度我们比较熟悉,重点来看一下稳定性。
稳定性是指假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,a[i] = a[j] ,且 a[i] 在 a[j] 之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
先上结论:
插入排序是稳定的算法,在进行交换时,如果是相同的值,就不会进行交换。
希尔排序是不稳定的算法,相同值的元素可能会被分到不同的组中进行排序,其位置很可能会发生调换。
选择排序也是不稳定的算法,具体情况如下:
堆排一定是不稳定的算法,其每次取堆顶的值与最后一个进行交换,如果数组中有与其相同的值,其位置定发生了改变。
冒泡是稳定的。归并排序也是稳定的。在排序时,如果遇到值相等时,不交换。
但快排是不稳定的,具体过程如下:
快排还有一个重要的点就是其空间复杂度为 O(logN) ,因为在递归过程中会创建栈帧,其不断递归左右子区间,会创建大概 logN 个子区间,所以空间复杂度为 O(logN)。