计数排序

来源:互联网 发布:淘宝的nike是真的吗 编辑:程序博客网 时间:2024/06/06 17:50

工作中遇到了计数排序,在网页上看了一会儿还没懂!可能是个人功底差了,这里自己笔录了网上的帖子,并添加了自己的理解注释:


计数排序的基本思想是对于给定的输入序列中的每一个元素x,确定该序列中值小于x的元素的个数。

一旦有了这个信息,就可以将x直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只
有17个元素的值小于x的值,则x可以直接存放在输出序列的第18个位置上。当然,如果有多个元素
具有相同的值时,我们不能将这些元素放在输出序列的同一个位置上,因此,上述方案还要作适当的修改。

计数排序的思想是:统计一个数序列中小于等于元素i的个数为n,则直接把该元素i放到输出
序列的第n个位置上。并将小于等于i的元素个数减减:n--



/*
FUNCTION                :COUNTINGSORT,计数排序
input                        :A    待排序数组
                                 array_size 数组A的元素个数
                                 A数组中最大数为k
output                    :B  用于保存输出结果
return                    :NULL
other                        :
*/
//计数排序假设输入的元素都是0到k之间的整数。
void COUNTINGSORT(int *A, int *B, int array_size, int k)
{
  int C[k+1], i, value, pos;
 
  /*初始化C[i]为0*/
  for(i=0; i<=k; i++)
  {
      C[i] = 0;
  }
  /*统计在排序序列A中,用C[i]统计为i的元素个数*/
  for(i=0; i< array_size; i++)
  {
      C[A[i]] ++;
  }
  /*统计在排序序列A中,小于等于i的元素个数*/
  for(i=1; i<=k; i++)
  {
      C[i] = C[i] + C[i-1];
  }
  /*
  如果待排序数组A[i]的值为value,则在数组A中小于等于value为C[value].
  故将value的值放在输出序列的C[value]的位置上,然后将C[value]--
  */
  for(i=array_size-1; i>=0; i--)
  {
      value = A[i];
      pos = C[value];
      B[pos-1] = value;
      C[value]--;
  }
}

0 0
原创粉丝点击