基数排序(C++实现)

基本思想

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

步骤

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

时间复杂度分析

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

C++实现

int maxB(vector::iterator b, vector::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 RadixSort(vector::iterator b, vector::iterator e) {
	list l[10];

	int max = maxB(b, e);
	int p = 1;
	vector re;
	for (int i = 1; i <= max; i++) {
		p *= 10;
		vector::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;
}

你可能感兴趣的:(C++,排序)