计数排序的C实现

 1 /×
 2  ×统计数组中元素出现的个数,将得到的统计个数记录在新数组的中
 3  ×/
 4 
 5 void CountingSort(int *array, int length)
 6 {
 7     int t;
 8     int i, z = 0;
 9     int min, max;
10     int *count;
11 
12     /*找出数组的最大最小值,确定计数的范围
13     */
14     min = max = array[0];
15     for(i = 0; i < length; ++i) {
16         if(array[i] < min)
17             min = array[i];
18         else if(array[i] > max)
19             max = array[i];
20     }
21     
22     //分配统计计数数组空间,大小为原数组的数域范围
23     count = (int *)malloc((max - min + 1) * sizeof(int));
24     for(i = 0; i < max - min + 1; ++i) {
25         count[i] = 0;
26     }
27     //统计array中每个元素出现的次数,并将次数保存在
28     //count[array[i]]中,此处减去min是为了节省统计数组的空间
29     for(i = 0; i < length; ++i) {
30         count[array[i] - min]++;
31     }
32 
33     //将统计数组还原到array中,其中array范围为min到max
34     //此处很好的解决了统计时节省空间减去min造成的不对称问题
35     for(t = min; t <= max; ++t) {
36         for(i = 0; i < count[t-min]; ++i) {
37             array[z++] = t;
38         }
39     }
40     free(count);
41 }

对于处理小型数据的排序速度较快,但是空间开销过大不适合大型数据。

posted @ 2012-05-10 16:41  Jojodru  阅读(314)  评论(0编辑  收藏  举报