O(n)复杂度的排序算法

  介绍了前面的很多排序算法后,也许你会问是否有一种O(n)复杂度的排序算法呢!答案当然是有的。但是和我们之前看到的算法不一样。前面的算法不管是插入排序,归并排序,还是快速排序,以及堆排序也好,它们都需要比较元素的大小。在导论上有证明了只要是比较排序算法,它的时间复杂度下界是O(nlogn)(当然也存在特例,比如桶排序)。也就是说要想达到O(n)的复杂度,我们必须在不进行比较大小的情况下,将元素排好序。下面我们来看看有哪些算法能做到这一点!

一. 计数排序

  















      计数排序有一个提前假设,是数值大小与数据的规模成线性关系,并且数值的大小不能过大,不然会花费很大的存储空间,这个是典型的空间换取时间的例子。原理:将要排序的关键字转换成整数形式,范围是0~max,然后创建一个max+1大小的存储数组。然后遍历数据,讲对应存储数组索引位加一。接一下遍历存储数组(这就是为什么要成线性关系),将每一位的数加上前一位的数,这就使得存储数组中每一位中的数是不大于该索引编号的元素个数。然后更加存储数组依次将数据放入结果数组中。

    听了一大坨也许你晕了,下面我们来根据图看看实现的过程吧!图中A表示数据数组,C表示存储数组,B表示结果数组。可以看到A中元素的大小最大为5,所以C的大小开到6(因为有可能有0元素)。设想一下如果最大元素为10^10,那么C的大小将超大,这就是计数排序的缺点。接下来将A中的元素在C中对应的索引加1。然后处理C数组,这里有人说可以不处理C数组直接输出不是也可以吗?没有元素的地方为0,如果C中元素超过1,说明A中有重复元素,依次输出就可以了啊!但是你可能没有考虑到稳定性的问题,你说相同元素有什么稳定性可言,但是如果每个元素附加了卫星数据呢,一般实际应用中都是有的多,那么这种方式就变得无法处理了。我在网上看到有人讲这种方法说成是桶排序,还不止一位朋友这么说,这里必须强调一下,其本质是简化的计数排序,与桶排序压根没有关系。。。我们接着说,遍历C数组,每个元素加上前一个元素得到

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值