算法:
1、找出待排序的数组中最大和最小的元素
2、统计数组中每个值为i的元素出现的次数,存入数组C的第i项
3、对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
4、反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
01.#include <stdlib.h> 02.#include <string.h> 03.#include <stdio.h> 04./************************************************************** 05. 功能:计数排序。 06. 参数: data : 要排序的数组 07. size :数组元素的个数 08. k :数组中元素数组最大值 +1 (这个需要+1) 09. 返回值: 成功0;失败-1. 10. *************************************************************/ 11.int ctsort(int *data, int size, int k) 12.{ 13. int * counts = NULL,/*计数数组*/ 14. * temp = NULL;/*保存排序后的数组*/ 15. int i = 0; 16. /*申请数组空间*/ 17. if ((counts = (int *) malloc( k * sizeof(int))) == NULL) 18. return -1; 19. if ((temp = (int *) malloc( k * sizeof(int))) == NULL) 20. return -1; 21. /*初始化计数数组*/ 22. for (i = 0; i < k; i ++) 23. counts[i] = 0; 24. /*数组中出现的元素,及出现次数记录*/ 25. for(i = 0; i < size; i++) 26. counts[data[i]] += 1; 27. /*调整元素计数中,加上前一个数*/ 28. for (i = 1; i < k; i++) 29. counts[i] += counts[i - 1]; 30. /*使用计数数组中的记录数值,来进行排序,排序后保存的temp*/ 31. for (i = size -1; i >= 0; i --){ 32. temp[counts[data[i]] - 1] = data[i]; 33. counts[data[i]] -= 1; 34. } 35. 36. memcpy(data,temp,size * sizeof(int)); 37. free(counts); 38. free(temp); 39. return 0; 40.} 41.int main() 42.{ 43. int a[8] = {2,0,2,1,4,6,7,4}; 44. int max = a[0], 45. i = 0; 46. /*获得数组中中的数值*/ 47. for ( i = 1; i < 8; i++){ 48. if (a[i] > max) 49. max = a[i]; 50. } 51. ctsort(a,8,max+1); 52. for (i = 0;i < 8;i ++) 53. printf("%d ",a[i]); 54.}