JAVA實現可解決包含負數的基數排序

平日所見的基數排序基本都是講正整數的,沒有講到負數的,所以今天寫一個可解決負數情況的基數排序。

首先,我們可以加上某個值,使得數組中肯定不會出現負數,然後這樣我們就可以按照以前基數排序的套路進行排序了。

因爲基數排序需要找到最大值,所以我們可以在尋找最大值的同時也尋找最小值。廢話不多說,上代碼。

 public int[] radixSort(int[] arr){
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < arr.length; i++) {
            max = Math.max(max, arr[i]);
            min = Math.min(min, arr[i]);
        }
        if (min<0) {	//如果最小值小於0,那麼把每個數都減去最小值,這樣可以保證最小的數是0
            for (int i = 0; i < arr.length; i++) {
                arr[i] -= min;
            }
        }
        max -= min; //!max也要處理!
        int maxLength = (max+"").length();
        int[][] bucket = new int[10][arr.length];
        int[] bucketElementCount = new int[10];
        for (int i = 0 ,n = 1 ; i < maxLength ; i++,n*=10) {
            for (int j = 0; j < arr.length ; j++) {
                int value = arr[j]/n % 10;
                bucket[value][bucketElementCount[value]] = arr[j];
                bucketElementCount[value]++;
            }
            int index = 0;
            for (int j = 0; j < bucketElementCount.length ; j++) {
                if (bucketElementCount[j]!=0){
                    for (int k = 0; k < bucketElementCount[j]; k++) {
                        arr[index] = bucket[j][k];
                        index++;
                    }
                }
                bucketElementCount[j] = 0;
            }
        }
        if (min<0){
            for (int i = 0; i < arr.length ; i++) {
                arr[i] += min;
            }
        }
        return arr;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章