文章来源:http://blog.seclibs.com/算法之排序(上)/
排序算法有很多种,甚至有很多都完全没有听过,我们最常见,也最经典的就是:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。
按照时间复杂度来进行划分可以将其划分为三类
- O(n2) :冒泡、插入、选择;基于比较
- O(nlogn):快排、归并;基于比较
- O(n):桶、计数、基数;不基于比较
这次我们来说时间复杂度为O(n2)的
在说具体的排序方法之前,先明确排序算法的评价标准
首先是排序算法的执行效率,执行效率一般从最好、最坏、平均时间复杂度上分析,其分析时间复杂度时需要考虑系数、常数和低阶,因为时间复杂度是在数据规模特别大的时候的增长趋势,在平时的代码中,数量级都是比较小的,所以还需要考虑这些问题。在基于比较的排序算法中,数值比较的次数和数据的移动次数也都是需要考虑进去的。
其次是内存的消耗,算法的内存消耗可以用空间复杂度来表示,当空间复杂度为O(1)的算法也可以称之为原地排序算法。
最后是算法的稳定性,当一组数据中有两个相同的值时,排序之后两个值的顺序是如果没有交换那它就是具有稳定性的算法。
然后我们再引入两个概念,有序度和逆序度
有序度是数组中具有有序关系的元素对的个数。
比如说2、4、3、1、5、6这组数组的有序度是11,因为它有11个有序元素对,分别是(2,4)、(2,3)、(2,5) (2,6)、(4,5)、(4,6)、(3,5)、(3,