一.堆排序的步骤
第一步:找出数组之中最大的数
第二步:获取最大的数的位数
第三步:将数字分配到各自的桶中,然后按照桶的顺序输出排序结果
第四步:循环第三步i次,i为最大数的位数
二.图解
假设现在我们要对这样一组数进行基数排序;
我们首先要找到这组数中的最大数(遍历数组),这里很明显最大的数为5678;
找出最大数的位数为四位,因此我们需要对这组数据进行四轮排序;
第一轮排序:我们从最低位(个位)开始排序:![](https://i-blog.csdnimg.cn/blog_migrate/c344deb996008fdbdfbc87c6187c580a.png)
遍历数组根据数的个位将每个数放入各个桶中,先进入桶中的数,在桶中的位置越靠下
接下来我们将桶中的数按桶的顺序倒出,一个桶中有多个数字的时候先倒出最靠下的数字(先进先出)
第一轮排序完成,我们还需要再进行三轮排序(最大的数位数有多少,我们就需要排多少次)
第二次我们需要从十位开始进行排序了:
同上面一样,我们将元素放入桶中之后再倒出来
这样,我们就完成了对十位的排序,后面我们继续对百位和千位进行排序即可(排序到千位是因为我们数组之中最大的数字为四位数)
三.代码实现
首先我们需要先找到数组之中最大的数字,这样我们才能根据最大数的位数确定后面排序的次数
public static int findmax(int[] arr){
//这里我们返回最大数的位数
int max=0;
for(int i=0;i<arr.length;i++) {
if(max<arr[i])max=arr[i];
}
int maxlength=0;
for(;max!=0;max/=10) {
maxlength++;
}
return maxlength;
}
这里我们需要创建一个桶,桶中需要存储十个数组,每个数组的最大长度与我们的待排序数组长度相同,但是这里我们有一个问题,我们怎么来记录我们在一个桶中放入一个元素,这个元素该放在对应桶中的位置呢?我们引入了一个桶计数器,桶计数器为一个一位数组,长度为10,用来记录每个桶中存储了元素的个数。
以下为桶排序的完整代码:
import java.util.Arrays;
public class Bucket_sort {
public static void main(String[] args) {
int[] arr= {5,84,925,75,2549,248,51,6,745,12,369,777};
bucketsort(arr);
}
public static void bucketsort(int[] arr) {
int maxlength=findmax(arr);
for(int count=0;count<maxlength;count++) {
int[][] bucket=new int[10][arr.length];
int[] bucketelement=new int[10];
for(int i=0;i<arr.length;i++) {
int element=arr[i];
for(int j=0;j<count;j++) {
element/=10;
}
element=element%10;
bucket[element][bucketelement[element]]=arr[i];
bucketelement[element]++;
}
int k=0;
for(int j=0;j<10;j++) {
for(int bcount=0;bcount<bucketelement[j];bcount++) {
arr[k]=bucket[j][bcount];
k++;
}
}
//System.out.printf("第%d轮排序之后结果为:",count+1);
//System.out.println(Arrays.toString(arr));
}
}
public static int findmax(int[] arr){
//这里我们返回最大数的位数
int max=0;
for(int i=0;i<arr.length;i++) {
if(max<arr[i])max=arr[i];
}
int maxlength=0;
for(;max!=0;max/=10) {
maxlength++;
}
return maxlength;
}
}