最近算法导论,学到了计数排序,顺便用C++实现了一下,代码如下所示:
#include<iostream>
using namespace std;
void Countingsort(int A[],int B[],int k,int n){ //k为数组A中的最大值,n为数组A的长度
int C[k+1];
int i,j;
for(i=0;i<k+1;i++)
C[i]=0;
for(j=0;j<n;j++)
C[A[j]]=C[A[j]]+1;
for(i=1;i<k+1;i++)
C[i]=C[i]+C[i-1];
for(j=n-1;j>=0;j--)
{
B[C[A[j]]-1]=A[j];
C[A[j]]--;
}
}
int GetMax(int A[],int n){
int Max=A[0];
for(int i=0;i<n;i++)
{
if(A[i]>Max)
Max=A[i];
}
return Max;
}
int main(){
int A[8]={2,5,3,0,2,3,0,3};
int B[8];
int k=GetMax(A,8);
Countingsort(A,B,k,8);
for(auto &i:B)
cout<<i<<endl;
}
以下为自己对该算法的想法,计数排序先输入数组A,排序方法中的数组C是用来统计数组A中的数出现的次数,刚开始的C数组的下标就为A中出现的值,之后的数组C从下标1开始依次累加前一个元素的值,数组C中的最后一个元素的值必为数组A中数的总个数,所以输出B的数组下标应该为C[A[j]]-1,计数排序的时间复杂度为Theta(k+n).