计数排序时间复杂度O(n),空间复杂度O(n)
计数排序的基本思想是:统计一个数序列中小于某个元素a的个数为n,则直接把该元素a放到第n+1个位置上。当然当过有几个元素相同时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到k之间的整数。
(1)统计数组中某个元素出现的个数k
(1)统计数组中小于等于某个元素a的个数n
(2)把元素a放到第n的位置,放置元素后要减1,因为当有几个元素相同时不能放到同意位置上
void countingSort(vector<int> &a)
{
vector<int>::iterator it;
it = max_element(a.begin(), a.end());
vector<int> c(*it + 1, 0);
for(int i = 0; i < a.size(); i++)
c[a[i]]++;
for(int i = 1; i < c.size(); i++)
c[i] = c[i - 1] + c[i];
vector<int> b(a.size(), 0);
for(int i = 0; i < a.size(); i++)
{
b[c[a[i]] - 1] = a[i];
c[a[i]]--;
}
a.assign(b.begin(), b.end());
}
桶排序:
(1)统计数组中某个元素出现的个数k
(2)根据统计结果,若出现次数n大于0,则将n个该数添加到目的数组中
void countingSort(vector<int> &a)
{
vector<int>::iterator it = max_element(a.begin(), a.end());
vector<int> c(*it + 1, 0);
for(int i = 0; i < a.size(); i++)
{
c[a[i]]++;
}
vector<int> b;
for(int i = 0; i < c.size(); i++)
{
it = b.end();
b.insert(it, c[i], i);
}
a.assign(b.begin(), b.end());
}