计数排序
Counting Sort 计数排序
计数排序其实就是利用了数组可以O(1)时间访问元素的特性,来排序,可是如果数据范围很大时是很浪费空间的。
伪代码:
1 void counting_sort(A, B, k){ 2 for(i = 0 to k){ 3 c[i] = 0; 4 }//初始化 5 6 for(j = 1 to n){ 7 c[A[j]]++; 8 }//在c【j】中记录A【i】出现的次数 9 10 for(i = 1 to k){ 11 c[i] = c[i] + c[i-1]; 12 }//在c【i】中记录小于等于A【i】的元素出现的次数 13 14 for(j = n to 1){ 15 B[c[A[i]]] = A[i]; 16 c[A[i]]--; 17 } 18 }
通过数组来判断大小,和在序列中所在的位置,从而进行排序。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 5 const int maxn = 1000; 6 7 int a[maxn],c[100000],ans[maxn]; 8 9 void counting_sort(int l,int r,int max_k){ 10 for(int i = l;i <= r; i++)c[a[i]]++; 11 for(int i = 0;i <= max_k; i++)c[i] = c[i] + c[i-1]; 12 for(int i = l;i <= r; i++){ 13 ans[c[a[i]]] = a[i]; 14 c[a[i]]--; 15 } 16 } 17 18 int main(){ 19 int n,max_k = -1; 20 scanf("%d",&n); 21 for(int i = 1;i <= n; i++){ 22 scanf("%d",&a[i]); 23 max_k = max(max_k,a[i]); 24 } 25 counting_sort(1,n,max_k); 26 for(int i = 1;i <= n; i++){ 27 printf("%d ",ans[i]); 28 29 } 30 }