本文主要介绍以下七大排序算法的性能总结以及稳定性分析,会将各个算法的简略思想再过一次,便于理解
1.直接插入:将未排好的数插入到已经有序的队列中,未排的数要和已经有序的队列中的所有数字进行比较,如果有n个数,对于完全乱序来说,其比较次数为N+N-1++++一直加到1,所以时间复杂度是O(n^2),当然,对于本身有序的队列来说,只需要N-1次比较,因为所有的数据都不需要动。综上,时间复杂度取最坏情况,O(N^2),空间的话就是O(1)。
稳定性:稳定。在插入排序中,我们假设前面的序列是有序的,当前数字如果小于前面的数,就将前面的数字往后挪,如果大于前面的数字就不挪了,就放在它后面,如果等于前面的数字我们也是放在它的后面,故插入排序是稳定的
2.希尔:希尔是直接插入的改进,采用了预排和直接插入排序结合,
稳定性:不稳定。因为一旦一样的数分在了不同的组,那就无法保证稳定性。
3.选择:从待排队列中,依次选择最大(小)值,每次选择一个数据出来,第一趟需要比较N次,第二趟N-1次。这里就是N+N-1++++一直加到1,无论数据是什么情况,时间复杂度均不变,空间复杂度是O(1)
稳定性:不稳定。比如4 2 3 2,排完之后,第二个2会排到第一个2之前,所以不稳定。
4.堆排:建堆+排序,这里建堆的时间复杂度是O(n),排序的时间复杂度是logN,所以总的时间复杂度是O(N*logN)
稳定性:不稳定。假设有一个大堆,根节点和其其中一个较大子节点数值相同,当发生排序的时候,根节点会变换位置到最后面,两者相对位置发生变化,所以是不稳定的。
5.冒泡:相邻元素都要相互比较,每次比较一轮,就会找到序列中最大的一个或最小的一个。时间复杂度O(n^2),空间复杂度是O(1)
稳定性:稳定。遇到大的才交换,小于和等于都不交换。
6.快速:快排这里的方法比较多,不再细说。
稳定性:不稳定。假如选择的key之后,左边和右边都有和key一样的值,那么最后交换的时候,key的相对位置就会发生变化,所以是不稳定的。
7.归并:这里采取的是分治思想
稳定性:稳定。因为交换元素时,可以在相等的情况下不移动。