# 计数排序 

* **介绍**
  * 定义
    * 计数排序是一种非常快捷的**稳定性强**的排序方法,时间复杂度O(n+k),其中n为要排序的数的个数,k为要排序的数的组大值。
  * 复杂度 O(n)
  * 思路: 一组数在排序之前先统计这组数中其他数小于这个数的个数,则可以确定这个数的位置。
  * 过程: 
    * 首先需要三个数组,第一个数组记录A要排序的数列大小为n,第二个数组B要记录比某个数小的其他数字的个数所以第二个数组的大小应当为K(数列中最大数的大小),第三个数组C为记录排序好了的数列的数组,大小应当为n。
    * 接着需要确定数组最大值并确定B数组的大小。并对每个数由小到大的记录数列中每个数的出现次数。因为是有小到大通过出现次数可以通过前面的所有数的出现次数来确定比这个数小的数的个数,从而确定其位置。
  * 关键字:
    * 计数
    * 按顺序输出
  * 存在问题
    * 仅可以对0-100之间的数进行排序。

* **代码**

```go

/**
Count 实现计数排序
	限制:仅限百内之整数
 */
func Count(li []int, max int) {
	a := make([]int, max)
	for i := 0; i < len(li); i++ {
		a[li[i]] += 1
	}

	for i, j := 0, 0; i < max; i++ {
		for ii := a[i]; ii > 0; ii, j = ii-1, j+1 {
			li[j] = i
		}
	}
}
```