计数排序的原理比较简单,但是很巧妙。有点类似于桶排序,但是有一些区别。
具体思想是,给定一个数组,先统计各个元素出现的次数,用元素的值做下标,得到一个新的数组。然后扫描这个数组,对于数组的每个下标,如果它对应的值不为零,说明原来数组中就有几个这样的值。由于下标的天然递增,依次将这些值展开就得到了排序后的数组。
但是计数排序有它的局限性,首先如果想用数组统计各个元素出现的次数,它的值必须是正整数。如果你想用map来统计次数的话,那么就无法保证下标的递增特性。(某些语言的map实现可能会自动按照下标排序,但复杂度就是另一回事了)。
最后,计数排序的复杂度是O(n+k),n为元素个数,k为最大值。代码如下:
// countSort.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
vector<int> countSort(vector<int>& v)
{
//找到最大值
int max = -1000000;
for (auto i : v)
if (i >= max)
max = i;
//扫描一遍,记录各元素出现的次数
vector<int> c;
c.resize(max + 1);
for (auto i : v)
c[i]++;
//对出现的每个元素,按照其出现的次数,依次展开到目标数组
vector<int> ans;
for (int i = 0; i < c.size(); i++)
{
if (c[i] != 0)
{
int temp = c[i];
while (temp--)
ans.push_back(i);
}
}
return ans;
}
int main()
{
vector<int> a = { 8,2,4,9,3,6,100 };
auto