在桶排序遇到负数时,我们的解决思路时将所有数先化为正数最后再返回为正数
具体的操作思路:
1.找到数组中最小的负数
2.让所有的数都减去最小的负数
3.对处理后的数进行排序
4.最后将排好的数再加上减去的负数
具体的实现代码如下
package 排序;
import java.util.Arrays;
public class 桶排序 {
// 确定桶的大小与个数,一般根据要排序的元素的值域区间取定。
// 设计一种方式使元素能映射至对应值域的桶的索引。
// 遍历所有元素,将它们入桶。
// 每个桶内元素排序。
// 从桶内依次提取各元素重新排列。
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] arr = {3, 7, 2 , 1 , 1 , 2 , 2, -1 ,-3,-5};
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 min=Arrays.stream(s).min().getAsInt();
int t[];
if(min<0) {
t = new int[max-min+1];
for(int i=0;i<s.length;i++) {
s[i]=s[i]-min;
}
}else{
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) {
if(min<0) {System.out.println(i+min);}
else {
System.out.println(i);
}
t[i]--;
}
}
}
}
产生的问题:当需要排序的数跨度非常的大,就会非常浪费空间!!!