例子:要对8,5,5,3,2这五个数进行排序
桶排序的话我们就需要几个装数字的容器,像学过的数组。
我们需要定义一个数组即八个容器并且对桶进行标号1~8;这个桶没装任何东西所以初始化全为0.
int a[]=new int[9];
for(int i=0;i<a.length;i++){
a[i]=0;
}
装一个数字,数字所对应的下标对应的值+1;例如传入2时其对应的值由0变为1
a[2]++;
所对应的代码如下:
public class 桶排序 {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] arr = {8,5,3,2,3};
bucket(arr);
}
public static void bucket(int s[]){
int t[] = new int[9];//确定所需要的桶数
for(int i=0;i<t.length;i++) {
t[i]=0;
}
for(int i=0;i<s.length;i++) {
t[s[i]]++;//分数所对应的桶++;
}
for(int i=0;i<t.length;i++) {
while(t[i]!=0) {
System.out.println(i);
t[i]--;
}
}
}
}
思考一:如果所排序的数字不确定,那就需要得到被排序数组的最大值
public class 桶排序 {
// 确定桶的大小与个数,一般根据要排序的元素的值域区间取定。
// 设计一种方式使元素能映射至对应值域的桶的索引。
// 遍历所有元素,将它们入桶。
// 每个桶内元素排序。
// 从桶内依次提取各元素重新排列。
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] arr = {3, 7, 2 , 1 , 1 , 2 , 2 };
bucket(arr);
// for(int i=0;i<arr.length;i++) {
// System.out.println(arr[i]);
// }
}
public static void bucket(int s[]){//通排序
int max=Arrays.stream(s).max().getAsInt();//得到s数组的最大值
int t[] = new int[max+1];//确定所需要的桶数
for(int i=0;i<t.length;i++) {
t[i]=0;
}
for(int i=0;i<s.length;i++) {
t[s[i]]++;//分数所对应的桶++;
}
for(int i=0;i<t.length;i++) {
while(t[i]!=0) {
System.out.println(i);
t[i]--;
}
}
}
}
思考二:如果被排序数组中存在负数,是不是这种方法就不行了呢?