1. 程式人生 > >非比較排序之桶排序(bucket sort)

非比較排序之桶排序(bucket sort)

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;
    }