radix sort主要分为两种,least significant digit radix sort 和 most significant digit radix sort。其应用场景,不单单是整数的排序。 radix sort并非原地排序算法,它的空间复杂度是O(kn)。radix sort的时间复杂度是O(kn),n是key的数目,k是每一个key的digit数目。 对整数排序,一般使用LSD radix sort,由于这样正好是位数多的会排在后面,好比1,2,11通过排序后是1,2,11。若是是用MSD radix sort来排序,就是1,11,2. 对字符串排序(好比单词),用MSD radix sort,由于这样证号是按字典排序的。如a,ab,b经MSD排序后是a,ab,b;若是用LSD来排序,就是a,b,ab。 对于如下程序,有一点要注意:程序中的数组是从0开始的,而不是intro-to-algo中一般的1开始的数组示例,因此conting sort subroutine要稍微改一下。 /** * function: counting_sort_byte * @part: 0 1 2 3 -> [byte3][byte2][byte1][byte0] of an integer * * sort a[begin, end) by byteN **/ void counting_sort_byte(int A[], int begin, int end, int range, int part) { assert(part<=3 && part >=0); int *aux = (int*)malloc_c(sizeof(int)*range); int *b = (int*)malloc_c(sizeof(int)*(end-begin)); unsigned *a = (unsigned*)malloc_c(sizeof(unsigned) * (end-begin)); /* store the value of byteN of A */ int i, j; for (i=0; i<range; i++) { aux[i] = 0; } for (j=begin; j<end; j++) { a[j] = (unsigned) ( (A[j]>>(part*8))&0xFF ); /* a[j] belongs to [0, range) */ aux[a[j]] += 1; } for (i=1; i<range; i++) { aux[i] = aux[i-1] + aux[i]; } for (j=end-1; j>=begin; j--) { b[aux[a[j]]-1] = A[j]; aux[a[j]] -= 1; } for (j=begin; j<end; j++) { A[j] = b[j]; } free(a); free(b); free(aux); } /** * function: radix sort * * use counting_sort as key subroutine; * 4 parses of counting sort: counting_sort(A, begin, end, 256, i) where i = 0,1,2,3 **/ void radix_sort(int A[], int begin, int end) { for (int i=0; i<4; i++) counting_sort_byte(A, begin, end, 256, i); }