计数排序

原理

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

计数排序(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