计数排序的基本思想史对每个输入x,确定出小于x的元素的个数。有了这一信息我们就可以把x直接放在他的最终输出的数组上,关于这个算法,我们定义了3个数组,一个是原数组,一个是存储数组,一个则是临时数组,计数排序没有什么深奥的,重要的是理解,现将代码贴出来,欢迎各路大牛拍砖。。
C语言:
Codee#12914
#include <stdio.h>
#include <string.h>
#define MAX 100
int n;
void counting_sort( int * a , int *b , int k) //计数排序
{
int i;
int c [ MAX ];
memset( c , 0 , sizeof( c));
for( int j = 1; j <=n; j ++)
{
c [ a [ j ]] = c [ a [ j ]] + 1; //检查每个输入元素,如果一个元素的输入值是i,则c[i]加1
}
for( int j = 1; j <= k; j ++)
{
c [ j ] = c [ j ] + c [ j - 1 ];
}
for( int j =n; j >= 1; j --)
{
b [ c [ a [ j ]]] = a [ j ]; //自己画表格详细体会,仔细分析即可
c [ a [ j ]] --;
}
}
int main()
{
int a [ MAX ];
int b [ MAX ];
int i;
int k;
while( scanf( "%d" , &n) != EOF)
{
k =- 100;
for( i = 1; i <=n; i ++)
{
scanf( "%d" , & a [ i ]);
if( a [ i ] > k)
{
k = a [ i ];
}
}
counting_sort( a ,b , k);
for( i = 1; i <=n; i ++)
{
printf( "%d " ,b [ i ]);
}
}
return 0;
}
#include <string.h>
#define MAX 100
int n;
void counting_sort( int * a , int *b , int k) //计数排序
{
int i;
int c [ MAX ];
memset( c , 0 , sizeof( c));
for( int j = 1; j <=n; j ++)
{
c [ a [ j ]] = c [ a [ j ]] + 1; //检查每个输入元素,如果一个元素的输入值是i,则c[i]加1
}
for( int j = 1; j <= k; j ++)
{
c [ j ] = c [ j ] + c [ j - 1 ];
}
for( int j =n; j >= 1; j --)
{
b [ c [ a [ j ]]] = a [ j ]; //自己画表格详细体会,仔细分析即可
c [ a [ j ]] --;
}
}
int main()
{
int a [ MAX ];
int b [ MAX ];
int i;
int k;
while( scanf( "%d" , &n) != EOF)
{
k =- 100;
for( i = 1; i <=n; i ++)
{
scanf( "%d" , & a [ i ]);
if( a [ i ] > k)
{
k = a [ i ];
}
}
counting_sort( a ,b , k);
for( i = 1; i <=n; i ++)
{
printf( "%d " ,b [ i ]);
}
}
return 0;
}