一、各个排序特性
二、各个排序的稳定性分析及例子
稳定性如何定义:排序算法的稳定性并不是指它在对数组进行排序的时候的时间复杂度是否变化,而是对于相同数值的数据进行排序了之后它们的相对位置是否发生了变化,比如说在考试的时候,小明先交卷,小强后交卷,但是他们改出来的成绩是相同的,因为小明先交卷,改出来的成绩数据肯定放在前面,小强后交卷,改出来的成绩数据肯定放在后面,所以排完序之后要求小明的成绩依然在前面,这叫做排序算法的稳定性。如果排完序之后小明的数据跑到了后面去,那对小明来说肯定是不公平的,所以在这种情况下在进行排序的时候就需要选择稳定的排序算法了。
冒泡排序:稳定,因为冒泡排序是两两比较,再进行交换的,如果两个数据相等的时候不进行交换就能做到相同数据始终保持着原来的相对大小关系了。
选择排序:不稳定,很多人误以为这个选择排序是稳定的,包括有些书本也说选择排序是稳定的排序,他们想着选择排序就是每次找到一个最小值放到最左边,如果有多个最小值就拿靠前的那个就能做到不改变相同数据的相对位置了,我一开始也是这样子想的,但是再仔细想一下你会发现,如果最左边的值也存在重复的值,而且找到的最小值又是在这个重复的值的右边呢?那在你把找到的最小值交换到最左边的时候就会改变了另一个重复数字之间的相对位置了。所以选择排序是不稳定的。这里是一个易错点。演示看下图:
直接插入排序:稳定,因为直接插入排序是从后往前找比自己小的数,再插入到这个数的后面的,只要在找到和自己相等的数的时候,插入到这个数的后面,就能够保证相等的数的相对位置在排序前后是保持不变的。
希尔排序:不稳定,因为希尔排序是通过分组预排序实现的,当相同的数分到不同的组,在预排序的时候有可能改变它们的相对位置。如下:
堆排序:不稳定,在排序过程中,向下调整会使相同的数的相对位置发生变换。如下:(4条消息) “堆”排序_KOBE 0824 BRYANT的博客-CSDN博客
归并排序:稳定, 在归并的时候只要保证左边的先归并,右边的后归并就能保证相同数据的相对位置不发生变化,归并排序也是几个时间复杂度为O(N*logN)量级中唯一一个稳定的排序。但是需要O(N)的空间复杂度。
快速排序:不稳定,无论是快排的哪一种版本的写法(hoare法,挖坑法,前后指针法,三路划分法),都不能保证相同数据在排完序之后的相对位置不发生变化。因为当两个相等的数都比key大的时候,前一个数肯定会交换到右边更靠后的位置,后一个数肯定会交换到右边更靠前的位置,此时相对位置一定发生了变化,所以快速排序时不稳定的,如下图:
以上就是关于排序算法稳定性分析及各排序各方面特性的总结,你学会了吗?