桶排序(基数排序)
程序员文章站
2022-03-24 15:29:18
...
出现频率最多的 k 个数
设置若干个桶,每个桶存储出现频率相同的数,并且桶的下标代表桶中数出现的频率,即第 i 个桶中存储的数出现的频率为 i。把数都放到桶之后,从后向前遍历桶,最先得到的 k 个数就是出现频率最多的的 k 个数。
基数排序(也叫桶排序)
第一趟桶排序将数字的个位数分配到桶子里面去,然后回收起来,此时数组元素的所有个位数都已经排好顺序了
第二趟桶排序将数字的十位数分别分配到桶子里面去,然后回收起来,此时数组元素的所有个位数和十位数都已经排好顺序了(如果没有十位数、则补0)
第三趟桶排序将数字的百位数分别分配到桶子里面去,然后回收起来,此时数组元素的所有个位数和十位数和百位数都已经排好顺序了(如果没有百位数、则补0)
注意:桶的回收是按列来进行的。这个很重要。
public int[] radixSort(int[] a){
int max=findMax(a,0,a.length-1);
for(int i=1;max/i>0;i=i*10){//遍历的次数
int bucket[][]=new int[a.length][10];
for(int j=0;j<a.length;j++){
int col=(a[j]/i)%10;
bucket[j][col]=a[j];
}
int k=0;
for(int m=0;m<10;m++){
for(int n=0;n<a.length;n++){
if(bucket[n][m]!=0){
a[k++]=bucket[n][m];
}
}
}
}
return a;
}
/**
* @param a
* @param left
* @param right
* @return
*<p>Description: 递归找数组的最大元素</p>
*/
private int findMax(int[] a, int left, int right) {
if(left==right){
return a[left];
}
int m=a[left];
int n=findMax(a, left+1, right);
if(m>n){
return m;
}
else{
return n;
}
}
上一篇: Python使用matplotlib.pyplot画图显示中文
下一篇: 基数排序(桶排序)