计数排序
---雨竹清风
计数排序的思想:
计数排序就是使用一个辅助数组C,对数组A中的数进行排序,B数组存放排好序的数据。C数组的长度是A数组中最大数。B数组的长度与A数组的长度相同。
1. 将C数组进行初始化为0
2. 对C数组进行赋值。A数组中的值 == C数组下标,将C数组中的相应的位置加1.即:C[A[j]] = C[A[j]] + 1;
3. 将C数组,下标为i的数+其前一项的值 = C[i];即:
C[i] = C[i] + C[i - 1];
4. 将A数组中的某一项拿出来设为a,到C数组中去查下标为a的值,即是将要插入到B数组中的下标,即:
B[C[A[j]]] = A[j];
随即将C数组中相应的位置的数减一。
例子:
![计数排序 - 雨竹清风 - 雨竹清风的博客 计数排序 - 雨竹清风 - 雨竹清风的博客](http://img1.ph.126.net/LIHfIyxVKP4gCfMulAloGA==/6630316799258714452.png)
![计数排序 - 雨竹清风 - 雨竹清风的博客 计数排序 - 雨竹清风 - 雨竹清风的博客](http://img2.ph.126.net/TpnzCfq-TYkFJqlDUPZnwQ==/6630922630166295113.png)
1. C数组初始化
![计数排序 - 雨竹清风 - 雨竹清风的博客 计数排序 - 雨竹清风 - 雨竹清风的博客](http://img2.ph.126.net/wxXbxTShwhIea3jbwsFpbg==/6630326694863367629.png)
2.对C数组进行赋值
![计数排序 - 雨竹清风 - 雨竹清风的博客 计数排序 - 雨竹清风 - 雨竹清风的博客](http://img1.ph.126.net/ayX-XYUNOP31xT0zAnLuCA==/6630757703422131007.png)
A数组中 4和3个数都为2,所以C数组中的下标为4和3的位置的数为2。
3.累加和
![计数排序 - 雨竹清风 - 雨竹清风的博客 计数排序 - 雨竹清风 - 雨竹清风的博客](http://img0.ph.126.net/0p1yNRpaIdh9S8HD7ZwqZg==/6631397619188183946.png)
4.将A数组中的某一项拿出来设为a,到C数组中去查下标为a的值,即是将要插入到B数组中的下标。
![]() |
拿出A数组中最后一个位置的数3,到C数组中查找3号位置的数,是3.那么将A数组中的3插入到B数组中3号位置。
![计数排序 - 雨竹清风 - 雨竹清风的博客 计数排序 - 雨竹清风 - 雨竹清风的博客](http://img1.ph.126.net/lBq7vj3KPNQiwG4wzV9jjA==/6630862157026769230.png)
拿出A数组中倒数第二个位置的数4,到C数组中查找4号位置的数,是5.那么将A数组中的4插入到B数组中5号位置。
|
![计数排序 - 雨竹清风 - 雨竹清风的博客 计数排序 - 雨竹清风 - 雨竹清风的博客](http://img0.ph.126.net/g5QV-78n5YV8NnDCp99C_A==/6630817077050031075.png)
/
。。。。。。
最后得到的B数组为:
![计数排序 - 雨竹清风 - 雨竹清风的博客 计数排序 - 雨竹清风 - 雨竹清风的博客](http://img2.ph.126.net/TTo63BjIbL_3Fyvx3cw_kQ==/6630359680212199340.png)
即是A数组排好的顺序。
注意:A数组中可能会有0的存在,所以应该单独处理0。
伪代码如下:k是A数组中最大的数
for i = 1 ~ k
do C[i] = 0;
for j = 1 ~ n
do C[A[j]] += 1;
for i = 2 ~ k
do C[i] += C[i - 1];
for j = n ~ 1
do B[C[A[j]]] = A[j];
C[A[j]] -= 1;
时间复杂度是O(n + k);