基数排序是将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,一次进行一次排序。这样从最低位排序一直到最高位排序完成之后,数列就变成一个有序序列
NOTE: 基数排序只能排序非负整数
一、效率
基数排序的时间复杂度为 O(k*n)其中n是排序元素个数,k是数字位数。需要注意的是这个时间复杂度不一定优于 O(n*log_n)
二、实现
基数排序的过程图示如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| int maxbit( int data[], int size ) { int i; int maxData = data[0]; for ( i = 1; i < size; ++i ) { if ( data[i] > maxData ) maxData = data[i]; } i = 1; while ( maxData >= 10 ) { maxData /= 10; ++i; } return i; }
void radix_sort( int data[], int size ) { int d = maxbit( data, size ); int temp[size]; int count[10]; int i, j, k; int radix = 1; for ( i = 1; i <= d; i++ ) { for ( j = 0; j < 10; j++ ) count[j] = 0;
for ( j = 0; j < size; j++ ) { k = ( data[j] / radix ) % 10; count[k]++; } for ( j = 1; j < 10; j++ ) { count[j] = count[j-1] + count[j]; } for ( j = size-1; j >= 0; j-- ) { k = ( data[j] / radix ) % 10; temp[count[k]-1] = data[j]; count[k]--; } for ( j = 0; j < size; j++ ) { data[j] = temp[j]; } radix = radix * 10; } }
|