基数排序(C++实现)

本文介绍了基数排序(桶排序),主要用于整数排序。其基本思想是提取整数各位值存于对应桶中,多次循环后使数据有序。文中给出排序步骤,分析时间复杂度为O(nlogmmax) ,最后提及了C++实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思想

基数排序(radix sort)又称桶排序(bucket sort)。主要用于整数的排序。通过提取整数的各个位的 值,将其存放到对应的桶中,再将各个桶按照顺序,将桶里面的值依次提取出来。进行多次循环,单次循环后数据还是处于无序状态,但是当最后依次循环完成时,数据是有序的。

步骤
  1. 得到要统计的数据中最大数的位数,作为循环的次数i
  2. 从要排序的数据中取出一个数据
  3. 提取出该值的当前位的值,将其分类到指定的桶中。以十进制为例,提取数据的个位/百位/千位…将数据分类到0-9这10个桶中
  4. 遍历所有要排序的数据,将所有的数据分类到对应的桶中
  5. 将所有的桶中的数据按顺序存放到一个大桶中
  6. 重复步骤2-5,直到执行i次循环

时间复杂度分析

最外层循环的次数取决于要排序的数据的最大值的位数,假设按照十进制的方式将数据分到十个桶中,则:
i=log⁡10maxi=\log_{10}{max}i=log10max
其中maxmaxmax为要排序数据的最大值。
每次循环需要遍历所有的数据,因此该排序算法的时间复杂度为:
O(nlog⁡mmax)O(n\log_{m}{max})O(nlogmmax)
当使用十个桶进行排序时,时间复杂度为
O(nlog⁡10max)O(n\log_{10}{max})O(nlog10max)

C++实现

int maxB(vector<int>::iterator b, vector<int>::iterator e) {

	int max = *b;
	while (b != e) {
		if (max < *b) {
			max = *b;
		}
		b++;
	}

	int i = 0;
	while (max > 0) {
		i++;
		max /= 10;
	}
	return i;
}
vector<int> RadixSort(vector<int>::iterator b, vector<int>::iterator e) {
	list<int> l[10];

	int max = maxB(b, e);
	int p = 1;
	vector<int> re;
	for (int i = 1; i <= max; i++) {
		p *= 10;
		vector<int>::iterator cb = b, ce = e;
		while (cb != ce) {
			int t = (*cb) % p / (p / 10);
			l[t].push_back(*cb);
			cb++;
		}
		/*for (int i = 0; i < 10; i++) {
			for (auto a = l[i].begin(); a != l[i].end(); a++) {
				cout << *a << " ";
			}
		}
		cout << endl;*/
		re.clear();
		for (int i = 0; i < 10; i++) {
			for (auto a = l[i].begin(); a != l[i].end(); a++) {
				re.push_back(*a);
			}
			l[i].clear();
		}
		/*for (auto i = re.begin(); i != re.end(); i++) {
			cout << *i << " ";
		}
		cout << endl;*/
		b = re.begin();
		e = re.end();
	}
	return re;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值