排序学习笔记(5) - 内部排序小总结

 把殷版的《数据结构》内部排序部分大致看了一遍,还是感觉到了收获。由于对基数排序(不是一个路数)和归并排序(额外n的存储空间,很致命)并不是很感兴趣,所以就没学习这两个部分。另外,外部排序还没开始,下一步即将开始。

 

大体的感想是:

1,排序的思想和代码实现都有谱了。以前,一说到qsort,要写代码,难受死了,非常费劲,但这次看完之后感觉非常明白,甚至能够把代码背下来。想面我的,不怕了。

2,快速排序确实是无可匹敌的。但是就像任何事情一样,都不是万能的。明白了,快速排序原来也需要和其他的方法一起合作才能通吃(详见"排序学习笔记(2) - 快速排序")。

3,堆排序也很牛。我曾经问别人堆排序使用的是什么结构,95%以上的人都说是树或者链表;呵呵,让我感觉自己很有面子。

4,下面的表说明了都有哪种情况的事情可以由哪个排序来处理。

5,最后,最重要的,我觉得处理几乎所有的问题时候,技术都不是最重要的,即使当技术很重要的时候,也要讲求80/20原则。就是说,在工期、资源方面实现一个很难的算法可能比较不现实,所以就可以选择一个比较简单的,比如shell排序。排序是整个工程中性能的瓶颈吗?感觉可能是,但是实际上恐怕未必;把其他的地方优化一下,可能就OK了。在退一万步,如果我们用c++的话,stl里面的qsort()简直就是那一根稻草,凭啥不去抓?而是自己去重新建一个不圆不扁的轮子?(跑题了,技术跑到了管理中)

 

技术方面的总结就不做了,下面的这位兄弟做的非常全面,感谢先:

http://blog.csdn.net/myjava_024/archive/2008/11/04/3220319.aspx

 

这里把他总结的表格超过来:

排序法

 平均时间

最差情形

稳定度

额外空间

备注

冒泡

 O(n2)

  O(n2)

 稳定

O(1)

n小时较好

交换

  O(n2)

  O(n2)

不稳定

O(1)

n小时较好

选择

 O(n2)

 O(n2)

不稳定

O(1)

n小时较好

插入

 O(n2)

 O(n2)

稳定

O(1)

大部分已排序时较好

基数

O(logRB)

O(logRB)

稳定

O(n)

B是真数(0-9)R是基数(个十百)

Shell

O(nlogn)

O(ns) 1<s<2

不稳定

O(1)

s是所选分组

快速

O(nlogn)

O(n2)

不稳定

O(nlogn)

n大时较好

归并

O(nlogn)

O(nlogn)

稳定

O(1)

n大时较好

O(nlogn)

O(nlogn)

不稳定

O(1)

n大时较好

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值