理论基础 —— 排序 —— 计数排序

【概述】

计数排序是一种稳定的排序,属于非比较类排序,其基本思想是:对于给定的输入序列中的每一个元素 x,确定该序列中值小于 x 的元素的个数,一旦有了这个信息,就可以将 x 直接存放到最终的输出序列的正确位置上。

例如,如果输入序列中只有 17 个元素的值小于 x 的值,则 x 可以直接存放在输出序列的第 18 个位置上。当然,如果有多个元素具有相同的值时,不能将这些元素放在输出序列的同一个位置上,在代码中作适当的修改即可。

【排序过程】

计数排序的排序过程为:

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

【源程序】

#define MAXNUM 20//待排序数的最大个数
#define MAX 100//待排序数的最大值
int res[MAXNUM];
int temp[MAX+1];
void countSort(int a[], int n){
    for(int i=0;i<n;i++)//统计i的次数   
        temp[a[i]]++;  
    
    for(int i=1;i<=MAX;i++)//对所有的计数累加,统计数组a的前缀和与小于小于a数组值出现的个数
        temp[i]+=temp[i-1];
     
    for(int i=n-1;i>=0;i--){//逆向遍历源数组,根据计数数组中对应的值填充到新数组中
        res[temp[a[i]]-1]=a[i];//temp[a[i]]表示数组a中包括a[i]和小于a[i]的总数
        temp[a[i]]--;//如果数组a中有相同的数,a[i]的下标-1
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值