基数排序的简单实现

2022-02-24 19:18:31 浏览数 (2)

基数排序是基于分配和收集来进行的,而通常内部排序是基于比较进行的,这一点需要注意。基数排序里涉及到多次的除法和模运算,因此基数排序是的执行时间较长。这里使用STL中的queue来作为桶,不需要单独去实现队列。

代码语言:javascript复制
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;

//这里选择基数位10   对10进制的数字进行基数排序

//获取10进制数的第i位    i从0开始
/*
比如987, 第0位为7, 第一位为8, 第二位为9
*/
int getBit(int x, int i) {
	while(i --) x /= 10;
	return x %= 10;
}

//基数排序要求数组中的每一个数字的位数相同     d表示位数 
void radixSort(int *a, int n, int d) {
	queue<int> q[10];//10进制数需要10个桶
	//d位的数字需要进行  d趟的收集与分配
	for(int i=0; i<d;   i) {
		//分配
		for(int j=0; j<n;   j) q[getBit(a[j], i)].push(a[j]);
		//收集
		for(int j=0, k=0; j<10;   j) {
			while(! q[j].empty()) {
				a[k   ]  = q[j].front(); q[j].pop();
			}
		}
	}
}

int main() {
	int a[] = {33, 44, 11, 88, 22, 77, 99, 66, 55};
	int n = sizeof a/sizeof(int);
	radixSort(a, n, 2);
	for_each(a, a n, [](int a){cout << a << " ";});
	return 0;
}

执行结果:

0 人点赞