非比較排序之桶排序(bucket sort)
阿新 • • 發佈:2019-01-03
1. 桶排序
如果輸入的數組裡沒有重複,那麼一個普通陣列就可以,這個陣列的大小為原陣列中的max - min + 1。程式碼如下。
public static int[] bucketSort(int[] nums) {
if (nums.length <= 1) return nums;
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > max ) max= nums[i];
if (nums[i] < min) min = nums[i];
}
int[] bucket = new int[max - min + 1];
for (int i = 0; i < nums.length; i++) {
bucket[nums[i] - min]++;
}
int[] result = new int[nums.length];
int index = 0;
for (int i = 0; i < bucket.length; i++) {
while (bucket[i] > 0) {
result[index++] = i + min;
bucket[i]--;
}
}
return result;
}
public static int[] bucketSort(int[] nums) {
if (nums.length <= 1) return nums;
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > max) max= nums[i];
if (nums[i] < min) min = nums[i];
}
List[] bucket = new List[max - min + 1];
for (int i = 0; i < nums.length; i++) {
if (bucket[nums[i] - min] == null) {
bucket[nums[i] - min] = new ArrayList<Integer>();
}
List<Integer> list = bucket[nums[i] - min];
list.add(i);
bucket[nums[i] - min] = list;
}
int[] result = new int[nums.length];
int index = 0;
for (int i = 0; i < bucket.length; i++) {
if (bucket[i] != null) {
for (int j = 0; j < bucket[i].size(); j++) {
int temp = (Integer) bucket[i].get(j);
result[index++] = nums[temp];
}
}
}
return result;
}
public static int[] bucketSort(int[] nums) {
if (nums.length <= 1) return nums;
int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > max) max= nums[i];
if (nums[i] < min) min = nums[i];
}
List[] bucket = new List[max - min + 1];
for (int i = 0; i < nums.length; i++) {
if (bucket[nums[i] - min] == null) {
bucket[nums[i] - min] = new ArrayList<Integer>();
}
List<Integer> list = bucket[nums[i] - min];
list.add(i);
bucket[nums[i] - min] = list;
}
int[] result = new int[nums.length];
int index = 0;
for (int i = 0; i < bucket.length; i++) {
if (bucket[i] != null) {
for (int j = 0; j < bucket[i].size(); j++) {
int temp = (Integer) bucket[i].get(j);
result[index++] = nums[temp];
}
}
}
return result;
}