计数排序

   计数排序的基本思想是对每一个输入元素x,确定出小于x的元素个数。有了这一信息,就可以把x直接放到它在最终输出数组 的位置上。eg:若有5个元素小于x,则x就属于第六个输出位置 。这里需要注意几个元素相同时的情况。因为对于具有相同值的几个元素,不能把它们放在同一个位置。
   计数排序用伪代码可以表示如下:

COUNTING-SORT(A,B,k)
1 for i<-0 to k
2       do C[i] <-0
3 for j <-1 to length[A]
4       do C[A[j]]<-C[A[j]]+1     //此时C[i]包含等于i的元素的个数
5 for i <-1 to k
6       do C[i]=C[i]+C[i-1]       //此时C[i]包含了小于或等于i的元素的个数
7 for j<-length[A] downto 1
10      do B[C[A[j]]] <-A[j]
11         C[A[j]] <-C[A[j]]-1

用c++表示为:

#include  < iostream >
using namespace std;

const   int  arrLen  =   5 ;

void  Counting_Sort( int   * a,  int   * b,  int  k)
{
    
// a数组元素在[0..k]
 
    int  i, j;
    
int   * =   new   int [k + 1 ];
    
for  (i = 0 ; i <= k; i ++ ) c[i]  =   0 ;
    
for  (i = 0 ; i < arrLen; i ++ )
           c[a[i]]
++ ;
    
// 包含小于或等于i的元素个数
 
  
    
for  (i = 1 ; i <= k; i ++ ) c[i]  +=  c[i - 1 ];
   

     for  (j = arrLen - 1 ; j >= 0 ; j -- {
        b[c[a[j]]
- 1 =  a[j];
        c[a[j]]
-- ;
    }

}


int  main()
{
    
int  a[arrLen]  =   { 4 4 3 1 1 } ;
    
int  b[arrLen];
     Counting_Sort(a, b, 
5 );
    
for  ( int  i = 0 ; i < 5 ; i ++ {
        printf(
" %d  " , b[i]);
     }

     printf(
" /n " );
   
     return 0;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值