计数排序
计数排序处理取决于数据范围和数据个数.
时间复杂度 O(n+k) n代表数据个数,k代表数据范围。
基本思想:
1.得到每个值前方有多少比它小的数;
2.再线性处理每一个数
方法:
1.设置一个辅助数组c,数组大小为k,设置一个排序数组b,数组大小为n,b数组存着排好序之后的结果。
2.扫一遍a数组,每次让c[a[i]]++,即统计数字为a[i]出现的个数。
3.扫一遍c数组,每次让c[i] = c[i] + c[i-1];统计出i值之前有多少个数。
4.扫一遍a数组,得到a[i]的pos=c[a[i]],赋值给b[pos] = a[i] ,再让c[a[i]]--,作用是已经排了一个了。
代码如下:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 const int maxn = 100000; 6 const int kmaxn = 1000000; 7 int a[maxn]; 8 int b[maxn],c[kmaxn]; 9 void jsort(int n) 10 { 11 memset(b,0,sizeof(b)); 12 for(int i=0;i<n;i++) 13 c[a[i]]++; 14 for(int i=1;i<kmaxn;i++) 15 c[i] = c[i] + c[i-1]; 16 for(int i=0;i<n;i++) 17 { 18 int v=a[i]; 19 int pos = c[v]; 20 b[pos-1]=v; 21 c[v]--; 22 } 23 } 24 int main() 25 { 26 int n; 27 cin>>n; 28 for(int i = 0;i < n ; i++) 29 cin>>a[i]; 30 jsort(n); 31 for(int i=0;i<n;i++) 32 cout<<b[i]<<" "; 33 }
总结:计数排序取决于k或n的大小,当k的数据不是特别的大时候,计数排序的效率是非常高的。
当然k取的是最大值-最小值。
比如-10000~10000 的数据范围,只要让所有的值加上10000,即可完成排序。
应用:后缀数组,向前星