版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37979178/article/details/87784417
最近在学习排序算法一直在思考一件事情就是知其然与知其所以然,因为算法可以通过记忆记住写法,我们根本无需了解为什么只需记住其形还有结果进行运用就OK了,那么在学习的过程中我们还有必要知道其实现原理知其所以然吗?为此我在知乎提了两个相关的问题,欢迎大家积极讨论。(https://www.zhihu.com/question/312122688,https://www.zhihu.com/question/312097858)
基数排序的实现原理
基数排序有别于其他排序,他是一种全新的排序方式,但对这种排序方式的理解一样需要我之前提到的宏观-微观思想,基数排序从排序过程来看主要就是:1. 个位排序,十位排序,百位排序。。。2. 赋值从小到大,取值一样从小到大。3. 本位排序只是将低于本位的数排序同时为高位排序做准备,对于高于本位的数据没有实际意义(简言之基数排序的关键就是各个位数的拆分对比)。
代码实现
public class ArithmeticUtil{
public static int[] radixSort(int[] a,int n){
int length=n;
int divisor=1;
//二维数组确定行列
int[][]bucket=new int[10][length];
//单列的个数默认值为0
int[] count=new int[10];
//位数的具体值
int digit;
//for循环的次数代表比较数列中的最高位4代表的是百位
for(int i=1;i<4;i++){
for(int temp:a){
digit=(temp/divisor)%10;
bucket[digit][count[digit]++]=temp;
}
int k=0;
for(int j=0;j<10;j++){
if(count[j]==0){
coutinue;
}
for(int w=0;w<count[j];w++){
a[k++]=bucket[j][w];
}
//将表示同位数相等出现的次数置零方便更高位计数
count[j]=0;
}
divisor*=10;
}
return a;
}
}