计数排序并不基于元素的比较,而是一种利用数组下标来确定元素正确位置的算法。计数排序的核心在于将输入的数据值转化为键值存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序算法的时间复杂度O(n + k)(k为整数的范围)。伪码
简单描述就是,在一个有确定范围的整数空间中,建立一个长度更大的数组,如当输入的元素是 n 个 0 到 k 之间的整数时,建立一个长度大于等于k的数组。该数组的每一个下标位置的值代表了数组中对应整数出现的次数。根据这个统计结果,直接遍历数组,输出数组元素的下标值,元素的值是几, 就输出几次。
COUNTSORT(A,B,k)
//let C[0...k] be a new array
for i=0 to k
C[i] = 0
for j=1 to A.length
C[a[j]] ++
for i=1 to k
C[i] += c[i-1]
for j=A.length downto 1
B[C[A[j]]] = A[j]
C[A[j]] --
算法演示过程
文章图片
C++实现
#include
#include//用vector比用数组好操作一些
using namespace std;
void countsort(vector& arr, int k) {
int size = arr.size();
if (size < 1) {
return;
}
vector count(k + 1, 0);
vector temp(arr);
for (auto x : arr) {
count[x]++;
}
for (int i = 1;
i < k;
i++) {
count[i] += count[i - 1];
}
for (int j = size - 1;
j > 0;
j--) {
arr[count[temp[j]] - 1] = temp[j];
count[temp[j]]--;
}
}int main() {
vector arr = { 1,4,4,5,6,7,7,7,8,8,8,9,4,3 };
int k = 100;
countsort(arr, k);
for (auto x : arr)
cout << x << "\t";
cout << endl;
return 0;
}
文章图片
java实现
import java.util.Arrays;
public class P_jishu {
public static int[] CountSort(int[] a,int k){
int[] C=new int[k+1];
//构造C数组
int length=a.length,sum=0;
//获取A数组大小用于构造B数组
int[] B=new int[length];
//构造B数组
for(int i=0;
i=0;
i--)//遍历A数组,构造B数组
{B[C[a[i]]-1]=a[i];
//将A中该元素放到排序后数组B中指定的位置
C[a[i]]--;
//将C中该元素-1,方便存放下一个同样大小的元素}
return B;
}public static void main(String[] args){
int[] a = {1,2,3,4,4,3,2,3,3,32,5};
//int[] a = {2,3,4,4,4,4,2};
int k = 100;
System.out.println(Arrays.toString(CountSort(a,k)));
}
}
【C/C++|算法导论-计数排序】
文章图片
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析