计数排序与桶排序

计数排序时间复杂度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());
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值