计数排序的基本思想是对每一个输入元素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 * c = 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;
}
计数排序用伪代码可以表示如下:
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 * c = 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;
}