计数排序的基本思想:在一个数组中对每个元素按大小进行排名次,一个元素的名次是数组中比他小的元素的个数加上左边出现的与之相等的元素的个数(备注:这里名次越高说明元素越大)。例如数组a=[5,4,2,5,8,9],新建一个相同大小的数组用于保存数组元素的名次,得到名次数组 R=[2,1,0,3,4,5]。
名次计算C++代码
template<class T>
void rank(T a[], int n, int r[])
{
for(int i=0;i<n;i++)
{
r[i]=0;
}
//比较所有元素对
for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
{
if(a[j]>a[i]) r[j]++;
else r[i]++;
}
}
利用名次数组进行排序
template<class T>
void jishuSort(T a[],int n,int r[])
{
T *temp = new T[n];
for(int i=0;i<n;i++)
{
temp[r[i]] = a[i];
}
for(int i=0;i<n;i++)
{
a[i] = temp[i];
}
delete [] temp;
}