基数排序解读

一约既定,山河无阻


基数排序

基本思想:

分配加收集也叫做桶排序:设置若干个箱子,将关键字为K的记录放入第K个箱子中分配,然后按照序号将箱子中的内容拿出来收集

使用要求

数字是有范围的,均由0-9这十个数字组成,只需要设置十个箱子,详解按个,十,百…进行排序
这里放一个百度上嫖来的图片,侵删
请添加图片描述
手写还是比较简单的,下面我们来尝试写一下代码,在写代码之前我们知道几点
1、我们需要使用十个桶,
2、每一个桶中可能不止一个元素 所以也就意味着需要一个二维数组使用数组的话Arr[num][10] 因为所有的元素可能在一个桶中,所以要有num行
3、需要放桶里,然后再进行收集,这样的次数需要数值最大数的位数次,每一次放之前都需要都需要对数据的清空 收集的时候记住从桶的下面开始收集,也就是先放的先收集

代码实现

实在话就是细节挺多的,而且我个人认为实现的一点也不优雅,我是想到哪 写到哪

#include<bits/stdc++.h>
using namespace std;
void swap(int &a,int &b){
	a^=b;
	b^=a;
	a^=b;
}
//函数功能获取Val上Site位的值 
int GetWei(int Val,int Site){
	int bit=1;
	while(--Site){
		bit*=10;
	}
	 return (Val/bit)%10;
	
} 
void RadixSort(vector<int> &V){
	//第一步来找一下其中最大的最大的一个值,来确定要放与收集的次数 
	int Max=V[0]; 
	for(int i=0;i<V.size();i++){
		if(V[i]>Max){
			Max=V[i];
		} 
	} //找最大的数
	int count=1;
	while(Max/=10){
		count++;
	} 
	for(int k=1;k<=count;k++){
		//既然是桶排序 自然也就需要桶 可能所有的数放在一个桶中
		int bruck[V.size()][10]={0}; 
		int top[10]={0};//用于记录每一个桶中的数的个数 
		//要进行几次的伸缩变换
		for(int j=0;j<V.size();j++){//开始分 
			//获取每一个数值
			int wei=GetWei(V[j],k);
			//得到位置之后,按照位置将数值放入桶中 走到这里我们发现 需要给每一个桶中需要计数 所以设置一个top[]数组
			bruck[top[wei]][wei]=V[j]; 
			top[wei]++; 
		}
		cout<<"此时桶中的数据是"<<endl; 
		for(int i=0;i<V.size();i++){
			for(int j=0;j<10;j++){
				cout<<bruck[i][j]<<"\t";
			}
			cout<<endl;
		}
		int x=0;
		for(int i=0;i<10;i++){//开始合并这些桶中的值 但是每一个桶中数据个数并不是一样 还有一点需要注意是从 低向高收集数据 
			int y=0;
			while(top[i]--){
				V[x++]=bruck[y++][i];	
			}
			
		}
		cout<<"收集这些桶到数组中"<<endl; 
		for(int h=0;h<V.size();h++){
		cout<<V[h]<<" "; 
		} 
		cout<<endl;	
	} 
}
int main(){
	int choice;int a;
	vector<int> V;
	cout<<"请输入你要排序的值"<<endl;
	while(scanf("%d",&a)!=EOF) V.push_back(a);
	RadixSort(V);
	cout<<"此时数组为"<<endl; 
	for(int i=0;i<V.size();i++){
		cout<<V[i]<<" "; 
	} 
	cout<<endl;
}


输入形式

请添加图片描述

效果截图

请添加图片描述

总结

有兴趣的可以自己尝试一下 打打代码其实也还好,感觉不错点个赞呗,铁子!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值