计数排序

原理

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

计数排序(Counting sort)是一种稳定的排序算法。计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。它只能对整数进行排序。

空间换时间,所以适合对数据范围集中的数据使用。

过程:

  • 找出待排序的数组中最大和最小的元素;
  • 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
  • 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
  • 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。

分析

时间复杂度:n

T(n)=O(n+k) 
注:k为范围,即新开辟的数组大小

代码

//假设输入的数据都是介于0 - k 的数
const int length = sizeof(arr)/sizeof(int)

void count_sort(int arr[],int &res[],int k){
    int *c = new int[k];//创建数组,长度是k
    for(int i=0;i<k;i++) c[i]=0;//初始化
    for(int i=0;i<length;i++){
        c[arr[i]]++;
    }
    for(int i=1;i<length;i++) c[arr[i]]+=c[arr[i-1]];//小于等于a的次数之和,此时c的值表示从第几位开始填这个数字
    for(int i=length-1;i>=0;i--){
        res[c[arr[i]]-1] = arr[i];
        c[arr[i]]--;
    }
}

 

转载于:https://www.cnblogs.com/pacino12134/p/11327171.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值