一约既定,山河无阻
基数排序
基本思想:
分配加收集也叫做桶排序:设置若干个箱子,将关键字为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;
}
输入形式
效果截图
总结
有兴趣的可以自己尝试一下 打打代码其实也还好,感觉不错点个赞呗,铁子!