计数排序

一.什么是计数排序

计数排序又称为鸽巢原理,它是对哈希直接定址法的变形应用。计数排序是一种非比较的排序算法,其核心在于将输入的数据值转化为存储在额外开辟的数组空间中。这说明计数排序只适合用于比较数据较为集中的数据,如果数据太过分散是非常浪费空间的。

二.具体实现步骤

  • 1.统计所有相同数据出现的次数
  • 2.根据统计的次数将序列放回到原来的数组返回

在这里插入图片描述

三.代码实现

void CountSort(int* num,int len)                                                                                                                      
{                                                                                                                                                     
    if(num==NULL||len<=0)                                                                                                                             
        return;                                                                                                                                       
                                                                                                                                                      
    int min=num[0],max=num[0];                                                                                                                        
    int i=0;                                                                                                                                          
    for(;i<len;i++)                                                                                                                                   
    {                                                                                                                                                 
        if(num[i]<min)                                                                                                                                
            min=num[i];                                                                                                                               
        if(num[i]>max)                                                                                                                                
            max=num[i];                                                                                                                               
    }                                                                                                                                                 
                                                                                                                                                      
    int range=max-min+1;                                                                                                                              
    int* tmp=(int*)malloc(sizeof(int)*range);                                                                                                         
    if(tmp==NULL)                                                                                                                                     
    {                                                                                                                                                 
        perror("use malloc");                                                                                                                         
        exit(1);                                                                                                                                      
    }                                                                                                                                                 
    memset(tmp,0,sizeof(int)*range);                                                                                                                  
    for(i=0;i<len;i++)                                                                                                                                
    {                                                                                                                                                 
         tmp[num[i]-min]++;                                                                                                                           
    }                                                                                                                                                 
    int index=0;  
    for(i=0;i<range;i++)                                                                                                                              
    {                                                                                                                                                 
        while((tmp[i]--)!=0)                                                                                                                          
        {                                                                                                                                             
            num[index]=i+min;
            index++;
        }
    }
}

四.效率分析

  • 计数排序是一个稳定的排序算法。当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k)。
  • 空间复杂度也是(n+k),其排序速度快于任何比较排序算法。当k不是很大并且序列比较集中时,计数排序是一个很有效的排序算法。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值