计数排序学习笔记
时间复杂度为Θ(n)+Θ(k)=Θ(n+k);限制为需要知道待排序数组中元素的取值范围,以确定k值。
//注意下标,数组C[]的下标范围为0~k,包括k,因为要排序的数字的范围是0~k
//数组b的下标范围为1~n,包括n
//b的下标不能为0,如下标为0,则表示c[i]=0,而实际上c[i]=0时,对应的a中所有小于等于i的元素已经访问完
//c[i]最后表示a[n]中小于等于i的元素的总个数,b[c[a[i]]]=a[i]表示a[i]在数组b中的位置
//例如,a[5]=10表示数组a中第6个元素为10,c[10]=3,表示a中小于等于10的元素个数为3,
// b[3]=a[5]=10表示10在b中的位置为3
//
#include <iostream>
using namespace std;
void CountSort(int a[],int b[],int n,int k);
int main()
{
int n = 8;
int k = 5;
int a[] = {2,5,3,0,2,3,0,3};
int b[n+1];
cout << "a[n]:" << endl;
for(int i=0 ; i<n ; i++){
cout << a[i] << " ";
}
cout << endl;
CountSort(a,b,n,k);
cout << "b[n]:" << endl;
for(int i=1 ; i<=n ; i++){
cout << b[i] << " ";
}
cout << endl;
return 0;
}
//input a[n],
//输入的n个数为0~k之间的整数
void CountSort(int a[],int b[],int n,int k)
{
int c[k+1];
for(int i=0 ; i<=k ; i++){
c[i] = 0;
}
for(int i=0 ; i<n ; i++){//统计a[n]中取值为0,1...k的个数,c[i]表示a[n]中满足a[j]=i的个数
c[a[i]] += 1;
//int tempk = a[i];
//c[tempk] +=1;
}
cout << "c[k]:" << endl;
for(int i=0 ; i<=k ; i++){
cout << c[i] << " ";
}
cout << endl;
for(int i=1 ; i<=k ; i++){//c[i]表示a[n]中满足a[j]≤=i的个数
c[i] += c[i-1];
}
cout << "c[k]:" << endl;
for(int i=0 ; i<=k ; i++){
cout << c[i] << " ";
}
cout << endl;
for(int i=n-1 ; i>=0 ; i--){//note:从大到小遍历以保证稳定性
b[c[a[i]]] = a[i];//
c[a[i]] --;
}
}
来源:CSDN
作者:littlekenan
链接:https://blog.csdn.net/littlekenan/article/details/21458349