排序算法的详解与总结

来源:互联网 发布:媒体监测数据 编辑:程序博客网 时间:2024/06/05 19:20

在开始介绍排序方法之前,需要先掌握排序的三个因素,这些因素是决定我们选择哪种排序方法的关键。

1) 时间复杂度,这个是程序员最关心的问题,大家都想最快速度算出结果才好。

2) 稳定性,当序列中两个相等的元素排序结束后前后顺序是否发生变动,这个是业务人员最关心的问题,程序员们没特殊要求基本不care。不过稳定性在业务上确实存在一定的意义,例如我们拿到一个班级按姓氏笔画排名的成绩单,现在要求我们按照考试分数进行排序,虽然张三和王二同分,在姓氏笔画名单中王二在前面,排序结束后王二还是要求在前面。

3)空间复杂度,在运算过程中直接占用空间存储的大小。说实话这里把它放在最后一位也代表了我个人对它的态度,我们可以认为在当前微服务横行、内存技术的发展的前提下,空间复杂度远远比时间复杂度的重要性低得多。而且要看你对空间复杂度是怎么理解的,我也可以把(内存乘以时间)当作空间复杂度,“时间很短内存占用很大的算法和“时间很长内存占用很小的算法”对于整个系统来说内存消耗其实是一样的,那么我更愿意选前者。


八类排序算法的详解和案例:

直接插入排序

希尔插入排序

简单选择排序和二元选择排序

冒泡排序

快速排序详解与实现

归并排序

堆排序

基数排序

 

复杂度和稳定性汇总:

排序方法

时间复杂度

空间复杂度

稳定性

直接插入

O(n^2)

O(1)

稳定

希尔

O(n^1.3)

O(1)

不稳定

简单选择

O(n^2)

O(1)

不稳定

冒泡

O(n^2)

O(1)

稳定

快排

O(nlogn)

O(nlogn)

不稳定

归并

O(nlogn)

O(n)

稳定

堆排

O(nlogn)

O(1)

不稳定

基数

O(d(r+n))

O(r+n)

稳定

复杂度参考:


总结下:

1        凡是不需要创建临时控件,通过指针变动位置互换就可以完成的排序,空间复杂度最低,只有O(1)

2        凡是按照固定的套路元素两两比较直到结束的,时间复杂度最高,是O(n^2),像冒泡排序、简单选择排序就属于这种排序。

3        选择排序方法第一优先是业务,也就是稳定性;第二优时间复杂度不能太差,剩下的取时间和空间的平衡。