一、计数排序
【算法原理】对于给定的自然数序列,求出记录i的个数c[i]。举例说明:待排序记录为{1,2,1,3,2},则c[1]=2,c[2]=2,c[3]=1,则第1~c[1]位置的元素为1,第c[1]+1~c[2]位置的元素为2,第c[2]+1~c[3]位置的元素为3。
数组c的长度是记录的数据范围。
计数排序是线性非比较类排序。
【稳定性】稳定
【时间复杂度】O(n+k)。
【空间复杂度】O(n)。
【要求】要求待排序记录的最大值不能太大,记录为自然数。
【示例代码】
1、借助中间数列c[i]保存数i的个数。辅助数列c大小开到k即可。代码相对简单,但失去稳定性——这不是计数排序的标准写法。
void count_sort(int n,int k){//要求n个记录为在[0..k]的整数
for(int i=0;i<n;i++) c[a[i]]++;//计算a[i]共有多少个
int cns=0;
for(int i=1;i<=k;i++)
for(;c[i];c[i]--)
ranked[cns++]=i;
}
2、借助中间数列c[i]保存数i在排好序的记录中的位置序号。用到前缀和知识。辅助数列c大小开到k即可。保持稳定性——这是计数排序的标准写法。
void count_sort(int n,int k){//要求n个记录为在[0..k]的整数
for(int i=0;i<n;i++) c[a[i]]++;//计算a[i]共有多少个
for(int i=1;i<=k;i++) c[i]=c[i]+c[i-1];//前缀和。计算i在排好序的记录中的位置序号
for(int i=n-1;i>=0;i--)ranked[--c[a[i]]]=a[i];
//a[i]在排好序的记录中的位置序号为c[a[i]],保存到数组ranked中,并将位置序号减1
}
二、基数排序
【原理】将待排序数按个位数排序后,再按十位数排序,再按百位数排序,……,一直到按最高位排序为止。
三、桶排序
【原理】给出若干有序桶,将记录有序地装入。每个桶的大小可以不是1。常见的桶的大小为1,此时与计数排序没有区别。
【参考文献】
1、https://blog.youkuaiyun.com/K346K346/article/details/50791102