基数排序的简单实现

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

#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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值