本博客已迁往http://coredumper.cn
计数排序(Counting Sort)
前提条件:有N个介于0到MAX_ELEMENT之间的整数存于数组A中,使用计数排序后将结果存于数组B中。
计数排序的时间性能上界为O(MAX_ELEMENT+N),该算法适用于MAX_ELEMENT较小的情况,例如若MAX_ELEMENT=O(N),则计数排序的性能为O(N)。
#define MAX_ELEMENT 99
void CountSort( int A[], int B[], int N )
{
int i;
int C[MAX_ELEMENT + 1];
for( i = 0; i <= MAX_ELEMENT; i++ ){
C[i] = 0;
}
for( i = 0; i < N; i++ ){
C[ A[i] ]++;
}
for( i = 1; i <= MAX_ELEMENT; i++ ){
C[i] = C[i] + C[i - 1];
}
for( i = N - 1; i >= 0; i-- ){
B[ C[ A[i] ] - 1 ] = A[i];
C[ A[i] ]--;
}
}
基数排序(Radix Sort)
总体思想:对各个元素,从最低位到最高位依次按照某一位的大小进行排序。
注意:在针对某一位进行排序时,这个子排序算法必须是稳定的。如果采用的算法不稳定,可能会出现如下问题:对于11和12,在针对个位排完序后的结果是11,12,但是在针对十位排完序后的结果可能是12,11,因为这两个数的十位相同,都是1。我们采用计数排序作为子排序算法。
该算法的时间性能的上界为O(DIGIT_NUM *(N+MAX_ELEMENT)),DIGIT_NUM为十进制表示的待排序元素的最大位数,N为待排序的元素个数,MAX_ELEMENT为十进制表示的待排序元素的每一位上的最大数即9。
#define DIGIT_NUM 3
#define MAX_ELEMENT 9
#define WEIGHT 10
void RadixSort( int A[], int B[], int N )
{
int i, j, a;
int C[MAX_ELEMENT + 1];
a = 1;
for( j = 0; j < DIGIT_NUM; j++ ){
if( j > 0 ){
a *= WEIGHT;
}
for( i = 0; i <= MAX_ELEMENT; i++ ){
C[i] = 0;
}
for( i = 0; i < N; i++ ){
C[ ( A[i] / a % WEIGHT ) ]++;
}
for( i = 1; i <= MAX_ELEMENT; i++ ){
C[i] = C[i] + C[i - 1];
}
for( i = N - 1; i >= 0; i-- ){
B[ C[ ( A[i] / a % WEIGHT ) ] - 1 ] = A[i];
C[ ( A[i] / a % WEIGHT ) ]--;
}
for( i = 0; i < N; i++){
A[i] = B[i];
}
}
}