排序算法-桶排序

非比较排序,以空间换取时间的一种排序方式,属于基数排序

package sort;

import org.junit.Test;
import utils.VerificationUtil;

import java.util.Arrays;

/**
 * @Author: wei1
 * @Date: Create in 2018/12/27 21:26
 * @Description: 桶排序,基数排序的一种
 */
public class BucketSort {
    // only for 0~200 value,因为数字大了的话数组会开辟的太大了。。。
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            int[] ints = generateRandomArray(30, 50);
            int[] arr1 = ints.clone();
            Arrays.sort(arr1);
            System.out.println(Arrays.toString(ints));
            int[] arr2 = bucketSort(ints);
            System.out.println(Arrays.toString(ints));
            if (!VerificationUtil.isEqual(arr1, arr2)) {
                System.out.println("Shit!!!!!!!");
            }
        }
    }

    public static int[] bucketSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return arr;
        }
        int max = Integer.MIN_VALUE;
        for (int i : arr) {
            if (max < i) {
                max = i;
            }
        }
        int[] bucket = new int[max + 1];
        for (int i = 0; i < arr.length; i++) {
            bucket[arr[i]]++;
        }
        int j = 0;
        for (int i = 0; i < bucket.length; i++) {
            // 唯一要注意的是这里
            while (bucket[i]-- > 0) {
                arr[j++] = i;
            }
        }
        return arr;
    }

    public static int[] generateRandomArray(int maxSize, int maxValue) {
        int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) ((maxValue + 1) * Math.random());
        }
        return arr;
    }

    @Test
    public void test() {

        int[] ints = generateRandomArray(33, 33);
        System.out.println(Arrays.toString(ints));
        bucketSort(ints);
        System.out.println(Arrays.toString(ints));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值