1. public IList<int> CountSort(int[] nums) {
    2. int max = nums.Max();
    3. int min = nums.Min();
    4. //申请一个足够容纳最小值到最大值的数组,数组的索引即是具体的值,数组的值为该索引出现的次数,容易浪费内存
    5. int[] mark = new int[max - min + 1];
    6. //记录每个值出现的次数
    7. foreach (var num in nums)
    8. {
    9. ++mark[num - min];
    10. }
    11. int startIdx = 0;
    12. //遍历记录将索引从小到大放回数组
    13. for (int i = 0; i < mark.Length; i++)
    14. {
    15. while (mark[i]-- > 0)
    16. {
    17. nums[startIdx++] = i + min;
    18. }
    19. }
    20. return nums;
    21. }