计数排序

之前的排序算法都是基于比较的基础上进行排序的。计数排序是假设输入的元素的每一个都是在[0,k]之前的一个整数。

排序的基本思想就是对每个输入的元素,统计小于这个元素的数量,下面是具体的C++的实现:首先将统计的数组全部置零,然后根据输入来统计每个输入的相同的元素出现的次数,接着根据这个个数我们算出每种相同的元素应该放置的范围,那么元素值s应该放置的范围就是[counting_array[s - 1] + 1, counting_array[s]]我们可以通过在这个范围内递增或者递减来放置相同值的不同元素。

void counting(int *input_array, int * output_array, int k, int n){
    int *counting_array = new int[k];

    for(int i = 0; i < k; i++){
        counting_array[i] = 0;
    }

    for(int j = 0; j< n; j++){
        counting_array[input_array[j]]++;
    }

    counting_array[0]--;
    for(int s = 1; s < k; s++){
        counting_array[s] = counting_array[s] + counting_array[s - 1];
    }

    for(int t = n - 1; t >= 0; t--){
        output_array[counting_array[input_array[t]]] = input_array[t];
        counting_array[input_array[t]]--;
    }
}

下面是为了跟其他的排序算法提供相同的接口,其中也要假设输入的值是没有负数的,这样我们才可以确定计数的数组的大小。

void counting_sort(int *array, int n){
    int *temp_array = new int[n];
    int max = std::numeric_limits<int>::min();

    for(int i = 0; i < n; i++){
        temp_array[i] = array[i];
        if(array[i] > max)
            max = array[i];
    }

    counting(temp_array, array, max + 1, n);
}

main函数:

int main(){
    const int ARRAY_LENGTH = 8;
    int array[ARRAY_LENGTH] = {2, 5, 3, 0, 2, 3, 0, 3};

    counting_sort(array, ARRAY_LENGTH);

    std::cout << "[ ";
    for(int i = 0; i < ARRAY_LENGTH; i++){
        std::cout << array[i] << " ";
    }
    std::cout << "]" << std::endl;

    return 1;
}

运行结果:

[ 0 0 2 2 3 3 3 5 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值