目录

1、计数排序介绍

2、流程图

3、代码实现

4、性能分析

5、参考资料

内容

1、计数排序介绍

什么是计数排序?

计数排序是一种特殊的排序算法,之前介绍的排序算法需要对数进行两两比较,效率下界为θ(nlgn);   而计数排序不需要对数进行比较就可以进行排序;很神奇吧,只需要对待排序数组进行遍历就可以排序,效率为Θ(n)。。哈哈,那么神奇,下面开讲!!!!

限制:计数排序只能对非负整数(0,1,2,3...N)进行排序

排序思想:计数排序的基本思想就是对每一个输入元素 x,确定出小于 x 的元素个数。有了这一信息,就可以把 x 直接放到它在最终输出数组中的位置上。例如:有 10 个年龄不同的人,统计出有 8 个人的年龄比 A 小,那 A 的年龄就排在第 9 位,用这个方法可以得到其他每个人的位置,也就排好了序。

2、流程图

排序算法步骤:

1)统计数组中每个值为 X 的元素出现的次数,存入数组 C 的第X 项

2)累加元素出现次数(计算不超过 X包括X 的元素的个数)

3) 将元素X依次放入到适当的位置

排序伪码:

CountSort(A,n,k) //A-待排序数组;n-排序数组元素个数;k-大于等于待排序数组元素最大值的某个整数    步骤一流程图 1)统计数组中每个值为 X 的元素出现的次数,存入数组 C 的第X 项

  步骤二 流程图 2)累加元素出现次数(计算不超过 X包括X 的元素的个数)

步骤三流程图 3)将元素X依次放入到适当的位置

3、代码实现(c++)

 1 #include <iostream>
 2 #include <vector>
 3 #include <time.h>
 4 using namespace std;
 5
 6 #define  N 10   //排序数组大小
 7 #define  K 100   //排序数组范围0~K
 8
 9 void CountSort(vector<int> &A)
10 {
11     //找出待排序数组最大、最小值
12     int min,max;
13     min=max=A[0];
14     for (int i=1;i<A.size();i++)
15     {
16         if (A[i]<min) min=A[i];
17         else if (A[i]>max) max=A[i];
18     }
19     //定义数组B存放排好的数
20     vector<int> B(A.size());
21     //定义数组C,大小为(max-min+1),C[i]为A中值为i的个数
22     vector<int> C(max-min+1);
23     for (int i=0;i<max-min+1;i++) C[i]=0;//初始为0
24     for(int i=0;i<A.size();i++) C[A[i]-min]++;//计数
25     for (int i=1;i<max-min+1;i++) C[i]+=C[i-1];//累加
26     for (int i=A.size()-1;i>=0;i--)
27     {
28         B[C[A[i]-min]-1]=A[i];//A中值倒序取出放到B中合适位置,并在C计数中减1
29                                          //因数组下标从0开始,所以减1
30         C[A[i]-min]--;
31     }
32     A.assign(B.begin(),B.end());//B赋给A
33 }
34 ////打印数组
35 void print_element(vector<int> A)
36 {
37     int len=A.size();
38     for (int i=0;i<len;i++)
39     {
40         std::cout<<A[i]<<" ";
41     }
42     std::cout<<std::endl;
43 }
44 // 随机参数排序数组,产生数组范围0~k的整数
45 void Random(vector<int> &a,int n,int k)
46 {
47     int i=0;
48     srand( (unsigned)time( NULL ) );
49     while(i<n)
50     {
51         a[i++]=rand()%k;
52     }
53 }
54
55 int main()
56 {
57     vector<int > vec_int(N);
58     Random(vec_int,N,K);
59     cout<<"源数组: ";
60     print_element(vec_int);
61     CountSort(vec_int);
62     cout<<"以排序数组: ";
63     print_element(vec_int);
64
65     system("PAUSE");
66     return 0;
67 }

4、性能分析

分析性能好的快速排序和本节介绍的计数排序的效率【排序数组取值为0~100的整数,数组大小分别取100,1000,10000,100000测试】

数组大小N 快速排序(ms) 计数排序(ms)
100 0.153012 0.236982
1000 6.00759 4.61228
10000 58.4422 16.0187
100000 4176.58 169.768

分析:当数组元素个数较大时,计数排序效率相当高!

 注意:当排序数组元素个数较少时效率会降低,并且数组范围较大时内存消耗会相对增多。

         何时使用计数排序:

          结:  1)待排序数组为非负整数

                  2) and 数组范围小,元素个数较多

5、参考资料

【1】http://blog.csdn.net/xyd0512/article/details/8261816

【2】http://www.cnblogs.com/gaochundong/p/sorting_in_linear_time.html

【3】http://www.cnblogs.com/xiao-cheng/archive/2011/10/05/2199657.html

转载于:https://www.cnblogs.com/zhoutaotao/p/3997219.html

算法导论-排序(四)计数排序(线性时间排序)相关推荐

  1. 时间排序python_算法导论 第八章 线性时间排序(python)

    比较排序:各元素的次序依赖于它们之间的比较{插入排序O(n**2) 归并排序O(nlgn) 堆排序O(nlgn)快速排序O(n**2)平均O(nlgn)} 本章主要介绍几个线性时间排序:(运算排序非比 ...

  2. 算法导论-线性时间排序习题解

    8.1-3 证明:对于长度为n的n!中输入中至少一半而言,不存在线性时间的比较排序算法.对于n!中的1/n部分而言又怎样呢?1/2n部分呢? 解:即在决策树模型中求1/2, 1/n, 1/2n 部分的 ...

  3. 最大子数组问题 线性时间_我最喜欢的线性时间排序算法

    最大子数组问题 线性时间 by Franziska Hinkelmann 通过Franziska Hinkelmann 我最喜欢的线性时间排序算法 (My Favorite Linear-time S ...

  4. 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现

    计数排序 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数.此处k为某个整数(输入数据在一个小范围内). 算法思想 计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数.然后再将 ...

  5. MIT算法导论5——线性时间排序

    常见的排序算法,像归并排序,堆排序时间复杂度为O(nlgn):像冒泡排序,插入排序则为O(n^2).对于排序算法而言,只要你是通过比较,O(nlgn)是一条难以逾越的界限.为了追求更快的速度,智慧的人 ...

  6. 第8章 线性时间排序

    一.概念 任何比较排序在最坏情况下都要用O(lgn)次比较不进行排序 计算排序.基数排序.桶排序都是稳定排序 二.代码 #include <iostream> #include <c ...

  7. Python数据结构与算法笔记(四):排序问题——列表排序

    排序 常见的排序算法: 列表排序Low三人组 冒泡排序,选择排序,插入排序 冒泡排序 原始数据. 将7和5进行比较,若7大于5,则交换. 8比7大,不进行交换,接下来看8.用8跟2进行比较. 最后,就 ...

  8. 算法导论第四章4.1-5 dp解法

    题目: 使用如下思想为最大子数组问题设计一个非递归的.线性时间的算法.从数组的左边界开始,由左至右处理,记录到目前为止已经处理过的最大子数组.若已知A[1-j]的最大子数组,基于如下性质将解扩展为A[ ...

  9. 基于visual Studio2013解决算法导论之012计数排序

     题目 计数排序 解决代码及点评 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #in ...

最新文章

  1. API 调用次数限制实现
  2. WCF 之 消息契约(MessageContract)
  3. 月老办事处月云开发微信小程序源码
  4. UML:图的分类及作用(共5类图,有9种图形)
  5. js去除png格式的图片阴影
  6. js基础知识汇总03
  7. 提供多种版本- MSI Code条形码字体具有可扩充性条形码控件MSI Plessey
  8. Arduino基础项目五:制作彩色LED灯
  9. 开源OA:O2OA平台手机APP指纹认证的配置
  10. 如何让计算机自动重启,教你如何实现让win7系统电脑定时自动重启
  11. c语言定义浮点变量i和j,2012年计算机等级考试二级C语言基础教程:数据类型、变量和运算符...
  12. linux 下DSP音频处理
  13. React Native-6.React Native Text组件,多组件封装实战之凤凰资讯页面
  14. linux 移动存储设备弹出操作详解
  15. 【Mybatis框架】初识Mybatis
  16. mysql餐馆点餐系统_课内资源 - 基于Jsp和MySql的餐厅点餐系统
  17. 【无标题】元宇宙背后的安全隐患
  18. Vue时间戳(年/月/日/时:分:秒and 刚刚/一分钟前···)
  19. 亿嘉和机器人上市了吗_年科研投入近10% 亿嘉和誓做“世界一流机器人公司”...
  20. 广东专插本有计算机专业的学校,广东省计算机专业专插本学校

热门文章

  1. 次世代3D游戏角色是如何打造出来的?
  2. 青果灵动刘睿:3D页游将有更多机会
  3. 面向对象的程序设计在游戏开发中使用(一):类
  4. 游戏CFHD,狙可不是随便就起的,狙击的作用是辅助
  5. WCF(五) 深入理解绑定
  6. R 语言学习过程全记录 ~
  7. 解析《中国互联网软件测试行业2018年度调研报告》
  8. 判断是否为微信环境下打开的网页
  9. 机器学习实战——特征工程之数据预处理
  10. iOS高仿城觅应用客户端项目(开发思路和代码)