计数排序

       计数排序的基本思想:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它的输出数组中的位置上了。首先利用一个辅助数组,数组大小是所有元素的最大值K+1,C[0....K],数组下标就是对应的元素。统计每个元素出现的次数存入数组C,然后计算每个元素前面替他元素出现的个数。将数组A的元素根据数组C的信息按顺序排列在输出数组B上。

#include <stdio.h>
#include <malloc.h>

void Count_sort(int A[], int B[], int k, int length)
{
    int i = 0;
    /*统计每个元素出现次数的临时辅助数组,下标对应元素的值*/
    int *C = (int *)malloc( sizeof(int) * (k+1) );
    
    if( C != NULL )
    {
        for(i=0; i <= k; i++)
        {
            C[i] = 0;  //初始化为0 
        }
    }
    else
        return;
        
    for(i=0; i < length; i++)
    {
        C[A[i]] += 1;  //统计每个元素出现的次数 
    }
    
    for(i=1; i <= k; i++)
    {
        C[i] += C[i-1];   //计算每个元素前面有多少其他的元素 
    }
    
    /*从数组A的最后一个元素开始排列,寻找对应的位置即C[A[i]-1]为下标位置
      放入数组B*/ 
    for(i = length-1; i >= 0; i--)
    {
        B[ C[ A[i] ] - 1 ] = A[i];
        C[ A[i] ] -= 1;
    }
    
    free(C);
}

int main(int argc, char *argv[])
{
  int i = 0;    
  int A[] = {5, 2, 4, 6, 1, 3, 1, 1, 23, 45, 22, 0, 4};
  int length = sizeof(A) / sizeof(A[0]);
  
  int *B = (int *)malloc(sizeof(int) * length);
  
  Count_sort(A, B, 50, length);
  
  for(i=0; i < length; i++)
  {
        printf("%d  ", B[i]);
  }
  
  free(B);
  
  printf("Press enter to continue ...");
  getchar();	
  return 0;

}


计数排序算法的时间复杂度为O(n+k),当k较小时,即元素的最大值较小,k = O(n)时, 这时运行时间为O(n)。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值