通常排序算法指的是内部排序算法,数据记录在内存中进行排序
排序算法大体分为两种:
一种是比较排序,时间复杂度O(nlogn)~O(n^2),主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等等
另一种是非比较排序,时间复杂度可以达到O(n),主要有:计数排序,基数排序,桶排序等等
其中有个重要的就是排序算法的稳定性。
排序算法的稳定性的简单形式为:如果Ai=Aj,排序前Ai在Aj之前,排序后Ai还在Aj之前,则这种算法排序是稳定的。通俗的讲就是两个相等的数的相对顺序不表。
注意的是:排序算法是否为稳定的是由具体的算法决定的,不稳定算法在某种情况下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。
排序算法稳定性的好处:排序算法如果是稳定的,那么从一个键上进行排序,然后再从另一个键上排序,前一个键排序的结果可以为后一个键排序所用。基数排序就是这样的,先按低位排序,逐渐按高位排序,低位排序后元素的顺序在高位也相同时是不会改变的。
常用的比较函数算法:
Java系统提供的Arrays.sort函数,对于基础类型,底层使用快速排序,对于非基础类型,底层使用归并排序。
这考虑到了排序算法的稳定性,对于基础类型,相同值是无差别的,排序前后相同值的相对位置并不重要,所以选择更为高效的快速排序,尽管是不稳定的排序算法,而对于非基础类型,排序前后相等实例的相对位置不宜改变,所以应该选择稳定的归并排序。
九大排序算法速度比较:传送门
常用的非比较排序算法: