计数排序的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 }
对于处理小型数据的排序速度较快,但是空间开销过大不适合大型数据。