java數據結構與算法之基數排序

基數排序思想:

      將所有待比較數值統一爲同樣待數位長度,數位長度較短短數值前面加0,  然後從個位開始,依次將數放入個位數上對應的桶,放完數據後,又從桶中拿出數據。接着是十位數,分別求出每一個待排序數的十位,將此數放入十位對應的桶內,放完所有數後,又依次從桶中拿出數據。。。直至完成最大位數。桶排序需要預先分配10倍的原數組大小,並且其對小數、負數支持不好。

 

代碼:

public class BaseSort {
    public static void main(String[] args) {
        int len = 800000;
        int[] a = new int[len];
        for ( int i = 0; i < len; i++) {
            a[i] = (int)(Math.random()*200000000);
        }

        int cnt = sort(a);
        System.out.printf("數組長度爲:%d\n", a.length);
        //System.out.println(Arrays.toString(a));
    }


    public static int sort(int[] a) {
        int stepCnt = 0;
        //第一輪:針對每個元素的個位進行排序處理

        //定義一個二維數組,表示10個桶,每個桶就是一個一維數組
        //二維數組包含10個一維數組
        //爲了防止在放入數的時候,數據溢出,則每個一維數組(桶),大小定位arr.length
        //基數排序是空間換事件的經典案例
        int[][] bucket = new int[10][a.length];
        //爲了記錄每個桶中,實際存放了多少個數據,定義一個一維數組來記錄各個桶每次放入的數據個數
        //bucketElementCnt[0] 記錄的是bucket[0]每次放入的數據的個數
        int maxBit = a[0];
        for (int i = 1; i < a.length; i++) {
            if (a[i] > maxBit) {
                maxBit =a [i];
            }
        }
        int maxLength = (maxBit+"").length();
        int[] bucketElementCnt = new int[10];
        for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
            //對每個元素的個位進行排序處理
            for (int j = 0; j < a.length; j++) {
                //取出每個元素的個位值
                int digitOfEle = a[j] / n % 10;
                //放入到對應的桶中
                bucket[digitOfEle][bucketElementCnt[digitOfEle]] = a[j];
                bucketElementCnt[digitOfEle]++;
            }
            //按照桶的順序,依次取出桶內的數據
            int index = 0;
            //遍歷每一個桶,並將桶中的數據放入到原數組中
            for (int k = 0; k < bucketElementCnt.length; k++) {
                if (bucketElementCnt[k] > 0) {
                    for (int l = 0; l < bucketElementCnt[k]; l++) {
                        //取出所有元素放入到原array中
                        a[index] = bucket[k][l];
                        index++;
                    }

                }
                bucketElementCnt[k] = 0;
            }
        }


        return stepCnt;

    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章