计数排序

8人阅读 评论(0) 收藏 举报
分类:

【分类】


 非比较类排序


【基本思想】


 对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,在代码中作适当的修改即可。


【特点】


 数据结构:数组

 稳定性:稳定

 要求:待排序数中最大数值不能太大。


【复杂度与辅助空间】


输入的元素是 n 个 0 到 k 之间的整数时 

 时间复杂度:O(n+k)

 所需辅助空间:O(k)


【算法步骤】

  1. 找出待排序的数组中最大和最小的元素
  2. 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
  3. 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
  4. 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1


【源程序】

#define MAXNUM 20//待排序数的最大个数
#define MAX 100//待排序数的最大值
int sorted_arr[MAXNUM]={0};
/*arr:待排序数组,sorted_arr:排好序的数组,n:待排序数组长度*/
void countSort(int *arr, int *sorted_arr, int n)  
{   
    int i;   
    int *count_arr=new int[MAX+1];

    memset(count_arr,0,sizeof(int) * (MAX+1));//初始化计数数组   
    
    for(i = 0;i<n;i++)  //统计i的次数   
        count_arr[arr[i]]++;  
    
    for(i = 1; i<=MAX; i++)  //对所有的计数累加,作用是统计arr数组值和小于小于arr数组值出现的个数
        count_arr[i] += count_arr[i-1];   
     
    for(i = n-1; i>=0; i--)  //逆向遍历源数组(保证稳定性),根据计数数组中对应的值填充到新的数组中  
    {  
        sorted_arr[count_arr[arr[i]]-1] = arr[i];//count_arr[arr[i]]表示arr数组中包括arr[i]和小于arr[i]的总数
        count_arr[arr[i]]--; //如果arr数组中有相同的数,arr[i]的下标减一
    }
    delete []count_arr;
}

查看评论

计数排序及其扩展思路

(1)原理和代码以及时间复杂度分析           1.计数排序的原理:设被排序的数组为A,排序后存储到B,C为临时数组。所谓计数,首先是通过一个数组C[i]计算大小等于i的元素个数,此过程只需...
  • NeilHappy
  • NeilHappy
  • 2012-01-15 13:56:37
  • 4918

Python实现计数排序

#! /usr/bin/env python #coding=utf-8#计数排序 def CountingSort(a, b, k): #c=[0]*(k+1) #let c[0...k] ...
  • will130
  • will130
  • 2015-04-08 13:18:57
  • 1174

比快速排序更快的排序--计数排序及其稳定性

假设有一个班级的小学生去操场上体育课,体育老师要求他们按照身高次序站成一队。每个小学生都知道自己的具体身高是多少厘米(假设每个小学生身高都不一样,否则就会为争执位置打架),但每个小学生都不承认别人比自...
  • Justin_bibo
  • Justin_bibo
  • 2017-03-03 19:09:43
  • 519

计数排序的理解与实现

计数排序是一种非基于比较的排序算法,其空间复杂度和时间复杂度均为O(n+k)...
  • liyuming0000
  • liyuming0000
  • 2015-07-16 16:03:43
  • 652

【算法导论】c++实现计数排序

计数排序的基本思想为:对每一个输入的元素x,确定出小于x的元素的个数。有了这一信息,那么就可以把x直接放到相应的位置上。 特点: 1 需要临时的存储空间,如果排序数据范围特别大时,空间开销很大。 ...
  • Harry_lyc
  • Harry_lyc
  • 2012-07-06 15:23:29
  • 2412

桶排序和计数排序

桶排序和计数排序 桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将阵列分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排...
  • tiantangrenjian
  • tiantangrenjian
  • 2012-01-03 15:26:50
  • 2857

计数排序及C语言实现

计数排序及C语言实现
  • bing_bing304
  • bing_bing304
  • 2014-11-25 22:04:37
  • 1019

基本排序系列之计数排序

简述计数排序               看了好多别人写的计数排序,看了好久都没看懂,弄了好久最后发现这么简单居然花了几个小时,所以在这里写上,希望和我一样的初学者不会再绕弯路。 一、简述计数排序的思...
  • lizhiqpxv
  • lizhiqpxv
  • 2014-07-03 17:12:54
  • 1972

关于计数排序的思考

计数排序思考
  • liyue199512
  • liyue199512
  • 2016-08-08 13:10:17
  • 315

经典算法之计数排序

一 引言 计数排序假设n个输入元素中的每一个都是介于0-k的整数,此处k为某个整数。当k等于O(n)时,计数排序的运行时间为Θ(n)。 二 基本思想 计数排序的基本思想就是对每一个输...
  • SunnyYoona
  • SunnyYoona
  • 2014-04-26 19:18:39
  • 3054
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 4056
    排名: 9553
    文章存档
    最新评论