排序算法的详解与总结
2017-12-11 18:08
183 查看
在开始介绍排序方法之前,需要先掌握排序的三个因素,这些因素是决定我们选择哪种排序方法的关键。
1)
时间复杂度,这个是程序员最关心的问题,大家都想最快速度算出结果才好。
2)
稳定性,当序列中两个相等的元素排序结束后前后顺序是否发生变动,这个是业务人员最关心的问题,程序员们没特殊要求基本不care。不过稳定性在业务上确实存在一定的意义,例如我们拿到一个班级按姓氏笔画排名的成绩单,现在要求我们按照考试分数进行排序,虽然张三和王二同分,在姓氏笔画名单中王二在前面,排序结束后王二还是要求在前面。
3)空间复杂度,在运算过程中直接占用空间存储的大小。说实话这里把它放在最后一位也代表了我个人对它的态度,我们可以认为在当前微服务横行、内存技术的发展的前提下,空间复杂度远远比时间复杂度的重要性低得多。而且要看你对空间复杂度是怎么理解的,我也可以把(内存乘以时间)当作空间复杂度,“时间很短内存占用很大的算法”和“时间很长内存占用很小的算法”对于整个系统来说内存消耗其实是一样的,那么我更愿意选前者。
八类排序算法的详解和案例:
直接插入排序
希尔插入排序
简单选择排序和二元选择排序
冒泡排序
快速排序详解与实现
归并排序
堆排序
基数排序
复杂度和稳定性汇总:
复杂度参考:
总结下:
1 凡是不需要创建临时控件,通过指针变动位置互换就可以完成的排序,空间复杂度最低,只有O(1)
2 凡是按照固定的套路元素两两比较直到结束的,时间复杂度最高,是O(n^2),像冒泡排序、简单选择排序就属于这种排序。
3 选择排序方法第一优先是业务,也就是稳定性;第二优时间复杂度不能太差,剩下的取时间和空间的平衡。
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 选择排序方法第一优先是业务,也就是稳定性;第二优时间复杂度不能太差,剩下的取时间和空间的平衡。