radix sort (using counting sort as the key subr...

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); }
相关文章
相关标签/搜索