计数排序算法思想

  • 以往的排序算法中,各个元素的位置基于元素直接的比较,这类排序称为比较排序。任意一个比较排序算法在最坏情况下,都需要做O(nlgn)次的比较。

  • 计数排序是基于非排序的思想的,计数排序假设n个输入元素中的每一个都是介于0到k之间的整数。

  • 计数排序的思想是对每一个输入元素x,确定出小于x的元素个数,有了这一信息,就可以把x直接放在它在最终输出数组的位置上,例如,如果有17个元素小于x,则x就是属于第18个输出位置。当几个元素相同是,方案要略作修改。

  • 计数排序是稳定的。

  • 计数排序的时间复杂度为O(n),空间复杂度为O(M),这里M为桶的数量

代码

要求:

对于一个int数组,请编写一个计数排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。

测试样例:

[1,2,3,5,2,3],6
[1,2,2,3,3,5]

程序:

class CountingSort {
public:
    int* countingSort(int* A, int n) {
        // write code here
        if(n<2){
            return A;
        }
        int min = A[0], max = A[0];
        for(int i=1; i<n; i++){
            if(max<A[i]){
                max = A[i];
            }
            if(min>A[i]){
                min = A[i];
            }
        }
        int* bucket = new int[max-min+1];
        for(int i=0; i<max-min+1; i++){
            bucket[i]=0;
        }
        for(int i=0; i<n; i++){
            bucket[A[i]-min]++;
        }
        
        int index=0;
        for(int i=0; i<max-min+1; i++){
            for(int j=0; j<bucket[i]; j++){
                A[index++]=i+min;
            }
        }
        return A;
    }
};

参考

计数排序


jack2wang
753 声望27 粉丝