转 http://blog.163.com/yuyang_tech/blog/static/216050083201382055821953/

与合并排序,堆排序,快速排序等基于比较的排序算法不同,计数排序,以及基数排序、桶排序是用非比较的一些操作来确定排序顺序的,计数排序、基数排序、桶排序是三种以线性时间运行的算法。

计数排序:

计数排序假设n个输入元素中的每一个都是介于0到k之间的整数,即输入的数据是具有上界的整数。

计数排序的基本思想就是对每一个输入元素x,确定出小于x的元素个数。有了这一信息,就可以把x直接放到它的最终输出数组中的位置上。例如,如果有17个元素小于x,则x就输入第18个输出位置。
下面为计数排序的代码:
//CountingSort.cpp
void CountingSort(int arrSrc[],int arrDst[],int arrLength,int upperLimit)
{
int* arrCount = new int[upperLimit+1];
for(int i=0;i<=upperLimit;i++)//初始化arrCount
arrCount[i] = 0;
for(int i=0;i<arrLength;i++)//arrCount[i]记录arrSrc[]中等于i的元素个数
arrCount[arrSrc[i]] += 1;
for(int i=1;i<=upperLimit;i++)//arrCount[i]记录arrSrc[]中小于等于i的元素个数
arrCount[i] += arrCount[i-1];
for(int i=arrLength-1;i>=0;i--)
{
arrDst[arrCount[arrSrc[i]]-1] = arrSrc[i];
arrCount[arrSrc[i]] -= 1;
}
delete []arrCount;
}

一个调用的实例: 
#include <iostream>
#include <stdlib.h>
using namespace std;
void CountingSort(int arrSrc[],int arrDst[],int arrLength,int upperLimit);
void main()
{
int arrLength = 10;
int upperLimit = 50;
int* a = new int[arrLength];
for(int i=0;i<arrLength;i++)
a[i]= rand()%(upperLimit+1);
for(int i=0;i<arrLength;i++)
cout << a[i] <<"  ";
cout << endl;
int* b = new int[arrLength];
CountingSort(a,b,arrLength,upperLimit);
for(int i=0;i<arrLength;i++)
cout << b[i] <<"  ";
cout << endl;
delete []b;
}

基数排序:
基数排序首先从最低有效位数字进行排序,然后重复这个过程,直到最高有效位数字排序完毕。一个实例如图所示。
在基数排序中,最重要的一点是 按位排序 使用的算法一定要是稳定的。
在常见的排序算法中,选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、合并排序是稳定的排序算法。当然,基数排序也是稳定的。(参考)
桶排序:(参考百度百科
桶排序也是基于一定的假设。假定:输入是由一个随机过程产生的[0, 1)区间上均匀分布的实数。将区间[0, 1)划分为n个大小相等的子区间(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…将n个输入元素分配到这些桶中,对桶中元素进行排序,然后依次连接桶输入0 ≤A[1..n] <1辅助数组B[0..n-1]是一指针数组,指向桶(链表)。
在桶排序算法的代码中,假设输入是含n个元素的数组A,且每个元素满足0≤ A[i]<1。另外还需要一个辅助数组B[O..n-1]来存放链表实现的桶,并假设可以用某种机制来维护这些表。
桶排序的算法如下(伪代码表示),其中floor(x)是地板函数,表示不超过x的最大整数。
procedure Bin_Sort(var A:List);
begin
n:=length(A);
for i:=1 to n do
将A[i]插到表B[floor(n*A[i])]中;
for i:=0 to n-1 do
用插入排序对表B[i]进行排序;
将表B[0],B[1],...,B[n-1]按顺序合并;
end;
下图演示了桶排序作用于有10个数的输入数组上的操作过程。(a)输入数组A[1..10]。(b)在该算法的第5行后的有序表(桶)数组B[0..9]。桶i中存放了区间[i/10,(i+1)/10]上的值。排序输出由表B[O]、B[1]、...、B[9]的按序并置构成。

计数排序,基数排序,桶排序相关推荐

  1. 八十五、再探希尔排序,桶排序,计数排序和基数排序

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 关于排序,其实还有很多,比如常见的希尔排序,桶排序,计数排序和基数排 ...

  2. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  3. 十大排序算法详解(二)归并排序、堆排序、计数排序、桶排序、基数排序

    文章目录 一.归并排序 1.1 归并排序基础[必会知识] 1.1.1 递归实现 1.1.2 非递归实现 1.2 归并排序优化 1.2.1 小数组使用插入排序 1.2.2 避免多余比较 1.2.3 节省 ...

  4. 三种线性排序算法 计数排序、桶排序与基数排序-BYVoid

    转自:BYVoid [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种,如我们最常用的快速排序和堆 ...

  5. 三种线性排序算法 计数排序、桶排序与基数排序—— 转自:BYVoid

    三种线性排序算法 计数排序.桶排序与基数排序 [非基于比较的排序] 在计算机科学中,排序是一门基础的算法技术,许多算法都要以此作为基础,不同的排序算法有着不同的时间开销和空间开销.排序算法有非常多种, ...

  6. 数据结构与算法学习--排序(桶排序,计数排序,基数排序)

    基数排序和计数排序可以参照链接 桶排序: 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递 ...

  7. 计数排序和桶排序 java代码实现

    文章目录 计数排序 java代码实现 单元测试 桶排序 java代码实现 单元测试 计数排序 java代码实现 package csdn.dreamzuora.sort;import java.uti ...

  8. 计数排序与桶排序python实现

    计数排序与桶排序python实现 计数排序 计数排序原理: 找到给定序列的最小值与最大值 创建一个长度为最大值-最小值+1的数组,初始化都为0 然后遍历原序列,并为数组中索引为当前值-最小值的值+1 ...

  9. 算法与数据结构07:前缀树,计数排序与桶排序

    算法与数据结构07:前缀树,计数排序与桶排序 前缀树 计数排序 桶排序 前缀树 Trie 1.根据字符串数组中,每个字符串的字符作为路径,组成而成的一个多叉树结构 2.每个节点都有一个paths数组, ...

  10. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

最新文章

  1. spring常用的三种依赖注入方式
  2. 程序员霸榜 2020 年十大高薪岗位,不料幸福度却垫底了!
  3. c语言字面值知识体系总结大学霸IT达人
  4. 宝塔php7.1地址在哪里,宝塔Linux面板安全入口地址忘了(方法一)
  5. 6个信号提醒是时候跳槽了 CIO务必get到
  6. 其他一些单元测试技巧
  7. 前端学习(2342):react的生命周期
  8. 64位linux安装mysql数据库吗_Linux下安装Mysql数据库
  9. 微软正式推出 gRPC-Web for .NET
  10. MySQL基础入门《2》创建数据库并插入数据
  11. 如何设置计算机用户名和密码忘了怎么办,电脑密码忘记了怎么办
  12. shell 下 时间 的傻狍子
  13. 终于试用了64位win7
  14. 2010提升你幽默感的经典短句
  15. 翻斗式雨量传感器VS压电式雨量传感器
  16. 10、VUE组件基本使用
  17. 学编程,自学还是选择培训机构?
  18. Scanner基本用法及其实例
  19. 石子合并——最经典的dp问题
  20. 二进制安装K8S - NODE 节点的安装

热门文章

  1. Mac-连接Windows远程桌面软件
  2. 阻止默认行为是配合passive使用
  3. Linux系统管理基本操作
  4. F5 任命 Ben Gibson 担任首席营销官
  5. 【BZOJ】1834: [ZJOI2010]network 网络扩容(最大流+费用流)
  6. mysql数据库热备份
  7. luogu p1459 三值的排序
  8. spring+springmvc+ibatis整合小结
  9. Objective C 中的nil,Nil,NULL和NSNull理解
  10. Option Explicit 语句