计数排序与基数排序

简介: 计数排序与基数排序

桶排序思想下的排序

  • 计数排序
  • 基数排序

分析:

  • 桶排序思想下的排序都是不基于比较的排序
  • 时间复杂度为O(N),额外空间复杂度O(N)
  • 应用范围有限,需要样本的数据状态满足桶的划分

计数排序

举个例子

假设现在有一个数组,统计了人的年龄,也就是说里面的数值范围是0~200(人的寿命范围假设为0~200),并且都是整数,此时如果我们需要对其年龄进行排序。

思路

  • 首先得到词频数组:申请一个长度为200的数组arr,每遍历到一个年龄,就在arr的相应index的值加1(比如统计数据是三个人,有一个人年龄是1岁,两个人是3岁,那么arr就是[0,1,0,2],index对应年龄,值代表该年龄的人的数量)
  • 将词频数组进行转换还原:还原规则是,遍历词频数组,遇到值小于0时,不做任何操作,当值大于0时,已经知晓当前index和value,也就是年龄,以及处于该年龄的数量,在res数组中pushvalue个index,那么还原后的数组就是[1,3,3]

复杂度

在上述过程中,遍历数组所需的时间复杂度就是O(N)

适用范围

假设上面的例子中,数组不是整数,数值范围也没有进行限制,比如数值是一个很大的复数,并且是一个根号值,在这种情况下,我们也不可能会去申请一个长度巨大的数组。

因此,计数排序是基于数据状况做的排序,相对于基于比较的排序,使用范围很窄。

基数排序

算法思想:基数排序又称为“桶子法”,从低位开始将待排序的数按照这一位的值放到相应的编号为0~9的桶中。等到低位排完得到一个子序列,再将这个序列按照次低位的大小进入相应的桶中,一直排到最高位为止,数组排序完成。

具体步骤

假设现在有数组[17,13,25,100,72]需要排序。

  • 1.确定最大位数为3,补齐位数的数组就是[017,013,025,100,072]
  • 2.申请桶(也可称之为容器,归根结底是一个数组或队列),假设分别为arr0、arr1、arr2...
  • 3.按个位数,将元素放入桶内,arr0=[100],arr1=[],arr2=[072],arr3=[013],arr4=[],arr5=[025],arr6=[],arr7=[017]。再按桶顺序将元素倒出,得到[100,072,013,025,017]
  • 4.按十位数,将元素放入桶内,arr0=[100],arr1=[013,017],arr2=[025],arr3=[],arr4=[],arr5=[],arr6=[],arr7=[072]。再按桶顺序将元素倒出,得到[100,013,017,025,072]
  • 5.按百位数,将元素放入桶内,arr0=[013,017,025,072],arr1=[100],arr2=[],arr3=[],arr4=[],arr5=[],arr6=[],arr7=[]。再按桶顺序将元素倒出,得到[013,017,025,072,100],此时就排好序了

图例分析

待排序序列为:[53, 3, 542, 748, 14, 214, 154, 63, 616],数位长度为3。

网络异常,图片无法展示
|

适用范围

可以看到,基数排序是依靠位数来进行排序,也就是说要求排序的对象需要有进制。所以基数排序也是不基于比较,而是基于数据状况的排序。

基数排序也是基于数据状况做的排序,但是比计数排序更好(基数排序是,几个进制就几个桶)



相关文章
|
5月前
|
搜索推荐 算法
计数排序就是这么容易
计数排序就是这么容易
21 0
|
6月前
|
搜索推荐 算法 C++
C++基数排序的实现
C++基数排序的实现
|
6月前
|
存储 搜索推荐 C++
C++计数排序的实现
C++计数排序的实现
|
11月前
|
搜索推荐 算法
计数排序详解
计数排序详解
|
存储 搜索推荐 算法
排序算法总结—时间复杂度O(n)—基数排序/计数排序小记
排序算法总结—时间复杂度O(n)—基数排序/计数排序小记
138 0
|
搜索推荐 算法
排序算法——计数排序(非比较排序)
​ 哈喽大家好,我是保护小周ღ,本期为大家带来的是排序算法中的计数排序,非常的有意思,值得学习而且计数排序是非交换排序,分享所有源代码,粘贴即可运行,保姆级讲述,包您一看就会,快来试试吧~ ​
105 0
|
人工智能 搜索推荐 算法
C/C++ 计数排序
计数排序是一种非基于比较的排序算法,该算法于1954年由提出。找出待排序的数组中最大和最小的元素统计数组中每个值为i的元素出现的次数,存入数组C的第i项对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)反向填充目标数组:将每个元素i放在新数组的第C[i]项,每放一个元素就将C[i]减去1它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n + k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)>......
137 0
C/C++ 计数排序
基数排序
概念:基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。 基数排序基于分别排序,分别收集,所以是稳定的。但基数排序的性能比桶排序要略差,每一次关键字的桶分配都需要O(n)的时间复杂度,而且分配之后得到新的关键字序列又需要O(n)的时间复杂度。假如待排数据可以分为d个关键字,则基数排序的时间复杂度将是O(d*2n) ,当然d要远远小于n,因此基本上还是线性级别的。 基数排序的空间复杂度为O(n+k),其中k为桶
|
存储 搜索推荐 算法
计数排序
概念:计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
|
存储 搜索推荐
排序算法-计数排序和桶排序
排序算法-计数排序和桶排序
排序算法-计数排序和桶排序