计数排序

计数排序处理取决于数据范围和数据个数.

时间复杂度 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,即可完成排序。

应用:后缀数组,向前星

posted on 2015-07-25 10:27  小松song  阅读(164)  评论(0)    收藏  举报

导航