计数排序

核心代码

 1 void CountSort(int arr[], int len)
 2 {
 3     int i;
 4     int j;
 5     int nMin;
 6     int nMax;
 7     int *pCount = NULL;
 8 
 9     assert(arr!=NULL && len>0);
10 
11     nMin = arr[0];
12     nMax = arr[0];
13     for(i=0; i<len; ++i)
14     {
15         //找最大值
16         if(arr[i] > nMax)
17         {
18             nMax = arr[i];
19         }
20         //找最小值
21         if(arr[i] < nMin)
22         {
23             nMin = arr[i];
24         }
25     }
26 
27     //开辟计数数组
28     pCount = (int *)malloc(sizeof(int)*(nMax-nMin+1));
29 
30     //数组清空
31     memset(pCount, 0, sizeof(int)*(nMax-nMin+1));
32 
33     //计数
34     for(i=0; i<len; ++i)
35     {
36         ++pCount[arr[i]-nMin];
37     }
38 
39     //排序
40     j = 0;
41     for(i=0; i<nMax-nMin+1; ++i)
42     {
43         while(pCount[i])
44         {
45             arr[j] = i+nMin;
46             --pCount[i];
47             ++j;
48         }
49     }
50 
51     //释放计数数组
52     free(pCount);
53     pCount = NULL;
54 }

应用场合:排序的数据属于同一个范围之内,分配得非常密集,并且重复的次数很多。

算法分析:

  最好时间复杂度:O(n)

  平均时间复杂度:O(n)

  最坏时间复杂度:O(n)

    空间复杂度:O(n)

      稳定性:不稳定

原文地址:https://www.cnblogs.com/chen-cai/p/7710421.html