每日一题之排序算法专题

排序算法专题
输入n个数字,对这n个数字按从小到大的顺序排序输出。
自己设计场景去考虑使用什么算法合适,可以从时间,空间,数字范围,n的范围等角度去写排序的算法。


常用的排序算法简介请移步
http://blog.csdn.net/hguisu/article/details/7776068
介绍的非常详细,非常赞的一篇博客


在这里只浅谈一下各种排序算法的用途:
先解释一下什么是稳定or不稳定的排序算法:举个例子,对于任意两个相同值的元素i,j,如果在排序之后,他们两没有被交换位置,那这就是一个稳定的排序算法,反之,这是不稳定的。
插入排序、冒泡排序:稳定的n^2复杂度的排序算法,在数据量很小的时候很实用。(在C++STL中,一旦待排序的元素个数小于一个阈值的时候,将直接用插入排序进行排序,避免多次递归带来的空间及时间消耗)
堆排序:时间复杂度nlogn,稳定的排序算法,对于只是求前k大(尤其当k比较小的时候)非常实用。
快速排序:在nlogn复杂度的算法里面,其均摊效率是最快的,只是,这不是一个稳定的排序算法。快速排序还有一个很实用的用途,就是求出来排名在(L,R)之间的所有元素的顺序。具体的用法是:
在每次递归qs(l,j); qs(i,r);的时候,一旦某个要递归的区间和我们要求的L,R这个区间没有交集,则不递归下去。
归并排序:归并排序的实际用途更广一些,除了在排序的时候,顺便可以求出来所排序列的逆序对(不知道此名词请百度)个数,还可以把排序的整个过程用文件来进行,这样就不需要在内存中存放任何其他东西了,特别适合对超大文件的排序。归并排序算法一般认为是二路归并,从数学角度计算二路归并应该是接近最佳效率的,但没有考虑不同操作的时间效率,利用文件进行归并排序时,读写的次数是效率的瓶颈,其延伸还有多路归并算法。
统计排序:也叫桶排,这个算法适用于要排序的所有元素大小范围都在一个比较小的数字范围内(例如100万),然后像数数的思路一样去对这些数字进行计数。时间复杂度非常稳定的O(N+K),其中N是元素个数,K是最大的数字的大小。


有兴趣的可以去 http://blog.csdn.net/leo115/article/details/8654294 看看STL中sort的实现方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值