计数排序算法实现(C版)

算法的步骤:

1.找出待排序的数组中最大和最小的元素

2.统计数组中每个值为i的元素出现的次数,存入数组C的第i

3.对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)

4.反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

 

源代码:

#include<stdio.h>
//double start_time = 0;
//double end_time = 0;
void counting(int *a, int *b, int len, int max)
{
  int i,j,k;
  int *c = (int *)malloc(sizeof(int) * max + 1);
  if(c == NULL)
    {
      return;
    }
  memset(c, 0, sizeof(int) * max + 1);
  //start_time = clock();

  //统计数组中每个值为i的元素出现的次数
  for(i = 0; i < len; i++)
    {
      *(c + *(a + i)) = *(c + *(a + i)) + 1;//++;
    }

  //对计数进行累加
  for(j = 1; j <= max; j++)
    {
      *(c + j) = *(c + j) + *(c + j - 1);
    }

  //反向填充目标数组
  for(k = len - 1; k >= 0; k--)
    {
      *(b + *(c + *(a + k)) - 1) = *(a + k);
      *(c + *(a + k)) = *(c + *(a + k)) - 1;//--;
    }


  //end_time = clock();
  free(c);
}
int main()
{
  int a[10] = {3, 2, 3, 5, 8, 7, 8, 2, 9, 0};
  int b[10] = {0};
  int i;

   //此处省略了待排数组最大值的查找
  counting(a, b, 10, 9);
 // printf("time cost:%f\n", end_time - start_time);
  for(i = 0; i < 10; i++)
    {
      printf("%d\n",b[i]);
    }
  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值