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);
}

你可能感兴趣的:(radix sort (using counting sort as the key subr...)