算法入门--计数排序

#include <stdio.h>
#include <stdlib.h>
/*计数排序,经常作为基数排序的子过程,稳定的,时间复杂度O(n)
对每一个输入元素x,确定出小于x的元素个数,直接放到相应的位置。 
*/
void counting_sort(int *a,int *b,int k,int length)
{
// a[]为原始数据数组,b[]为最终元素放置数组 ,k为最大的数的大小
// length为数量,c[]为临时存储区,用于表示<=当前数的数的个数 
   int i;
   int c[100];
   for(i=0;i<=k;i++)
       c[i]=0;//将临时存储区的各个位置置零
   for(i=1;i<=length;i++)
       c[a[i]]=c[a[i]]+1;//比如a[i]=4则将c[4]加1,最红c[i]将表示a中大小为i的数字个数 
   for(i=1;i<=k;i++)
       c[i]=c[i]+c[i-1];//c[i]表示<=i的元素的个数
   for(i=length;i>=1;i--)
   {
       b[c[a[i]]]=a[i];//比如a[i]=4,c[4]=3,也就是a有3个<=4的数,则将这个4放到b[3]中。
       c[a[i]]=c[a[i]]-1;//假如a有多个重复的4,则现在少了一个要排序的。即c[4]=2,有两个比当前4小的值。 
   } 
}
int main(int argc, char *argv[])
{
  int a[100]={0},b[100]={0};
  int k,n,i;
  printf("输入n,k\n");
  scanf("%d%d",&n,&k);
  printf("请输入%d个0--%d的数\n",n,k);
  for(i=1;i<=n;i++)
  scanf("%d",&a[i]);
  printf("进行计数排序后\n");
  counting_sort(a,b,k,n);
  for(i=1;i<=n;i++)
  printf("%d ",b[i]);
  system("PAUSE");	
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值