Counter Sort Test

140 篇文章 0 订阅
111 篇文章 0 订阅
#include"MyOutput.hpp"

template<typename T>
void CounterSort(T a[],int len){
    int max = 0;
    for(int i=0;i<len;i++){
        if(a[i] > max){
            max = a[i];
        }
    }

    if(max <= 0){
        println("Error:Someone of Input Array Element must be >0 at least,and don't contains negative-num (负数)");
        return;
    }
    T *tmp = new T[max+1]{0};
    
    //相当于桶排序的中(pre step)统计数字个数.
    for(int i=0;i<len;i++){
        tmp[a[i]]++;
    }
    //统计小于<=a[i]的数字个数
    //如<=maxVal的数字必定是len个(包含本身).
    //
    for(int i=1;i<=max;i++){
        tmp[i] += tmp[i-1];
    }
    // int totalNums = 0;
    // for(int i=0;i<=max;i++){
    //     print(i,'=',tmp[i],' ');
    //     totalNums += tmp[i];
    // }
    // println();
    // println("len= ",len," ; tatalNums= ",totalNums);

    //排序
    int *ret = new T[len]();
    for(int i=0;i<len;i++){
        //算法核心仔细体会过程,画图观察规律.
        //<=maxVal的数字必定是len个(包含本身).
        //那其他的数字也一样
        ret[tmp[a[i]] - 1] = a[i];
        tmp[a[i]]--;
    }
    //赋值给原来的数组.
    for(int i=0;i<len;i++){
        a[i] = ret[i];
    }
    delete []tmp;
}


int main(){
    //速度很快额!
    constexpr int len=10000;
    int a[len] = {0};
    createRandomArrayWithBase(a,len,len);
    // printlnArr(a,len);
    TimeSpec::begin();
    CounterSort(a,len);
    TimeSpec::print_cost_time();
    // printlnArr(a,len);
    println("========================================");
    constexpr int len2=10;
    int a2[len2] = {0};
    createRandomArrayWithBase(a2,len2,len2);
    printlnArr(a2,len2);
    TimeSpec::begin();
    CounterSort(a2,len2);
    TimeSpec::print_cost_time();
    printlnArr(a2,len2);

    return 0;
}


From beginning to end totally costs: 0 s
========================================
[5,3,1,5,1,0,0,1,4,6]
From beginning to end totally costs: 0 s
[0,0,1,1,1,3,4,5,5,6]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值