'counting sort'的代码和效率

前篇讲到对quicksort进行微调,使得它能有效支持大量重复数据的排序。

quicksort, merge sort, heap sort等都是“比较模型“的算法,其worst-case running time是不能小于nlgn的。这一点可以由decision-tree (一个二叉树)的叶子节点的个数来推出(因为worst-case属于decision-tree中的最长路径,所以只有当decision-tree平衡时,其worst-case 运行时间才是最小的。此时可以由树的高度和叶子节点树数量得出一个不等式,再利用n!的stirling公式近似,得出结论)。

而counting sort就是一种典型的”非比较模型“的算法,主要用于对取值范围较小的整数进行排序。时间负载度是n+range,当range较小时,就是n。

首先对比下counting sort和上篇的quicksort2的运行时间:

~/MyPro/Algorithms/sort $ ./counting_sort 1000000 100
start sorting ...
sorting finished!
====================================
counting sort                      
Sorting 1000000 elements
Time: 0s      42568us
The result is right !
====================================
~/MyPro/Algorithms/sort $ ./quicksort2 1000000 100
start sorting ...
sorting finished!
====================================
Randomized Quicksort               
Sorting 1000000 elements
Time: 0s      193737us
The result is right !
====================================

然后,给出counting sort的主要代码:

/**                                                                                                                          
 * function: counting_sort -- sort a[begin:end) of range [0, range-1]                                                        
 *                                                                                                                           
 **/
void counting_sort(int a[], int begin, int end, int range)
{
        int aux_array_size = range; /* 0 -- range-1 */
        int *aux = (int*)malloc_c(sizeof(int)*range);
        int *b = (int*)malloc_c(sizeof(int)*(end-begin));
        int i, j;
        for (i=0; i<range; i++)
        {
                aux[i] = 0;
        }
        for (j=begin; j<end; j++)
        {
                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(b);
        free(aux);
}

你可能感兴趣的:('counting sort'的代码和效率)