乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      排序算法 --- 基數(shù)排序

       貪挽懶月 2022-06-20 發(fā)布于廣東

      一、排序思想

      基數(shù)排序是桶排序的擴展,它將所有待排序的數(shù)值統(tǒng)一為同樣的數(shù)位長度,數(shù)位較短的前面補0,然后從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成后,待排序列就有序了。

      1. 案例:

      現(xiàn)有如下待排序列:

      53    3    542    748    14    214

      然后假如有如下10個桶(一維數(shù)組),編號從0到9:

      • 第一輪排序:將每個元素的個位數(shù)取出,然后放到對應編號的桶里。比如第一個元素53,個位數(shù)是3,所以放在下標為3的桶里。一輪下來,情況如下:
      第一輪

      第一輪結(jié)束后,按照桶下標順序,依次取出各桶中數(shù)據(jù),放回原數(shù)組,所以原數(shù)組就變成了:

      542    53    3    14    214    748
      • 第二輪:將每個元素的十位取出(沒有十位的就是0),然后放到對應編號的桶里。比如第一個元素542,十位是4,所以放到下標為4的桶里。一輪下來,情況如下:
      第二輪

      第二輪結(jié)束后,按照桶下標順序,依次取出桶中數(shù)據(jù),放回原數(shù)組,所以原數(shù)組就變成了:

      3    14    214    542    748    53
      • 第三輪:將每個元素的百位取出(沒有百位的就是0),然后放到對應編號的桶里。比如第一個元素3,百位是0,所以放到下標為0的桶里。一輪下來,情況如下:
      第三輪

      第三輪結(jié)束后,按照桶下標順序,依次取出桶中數(shù)據(jù),放回原數(shù)組,所以原數(shù)組就變成了:

      3    14    53    214    542    748    

      此時數(shù)組就是有序的了??偣惨M行幾輪呢?就是數(shù)組中最大數(shù)有多少位,就要進行幾輪。通過這些分析大家發(fā)現(xiàn)啥沒有?每一輪的排序,就是對0到9數(shù)字排序,那豈不是很適合用計數(shù)排序?沒錯,就是這樣,所以,基數(shù)排序中,我們要做的就是每一輪都用計數(shù)排序就好了。

      二、代碼實現(xiàn)

      以下代碼就是基于計數(shù)排序?qū)崿F(xiàn)的,網(wǎng)上的一些基數(shù)排序教程可能會用二維數(shù)組來表示桶,這樣容易理解,但是非常浪費空間。

      public static void radixSort(int[] arr) {
       if (arr == null || arr.length == 1) {
        return;
       }
       // 1. 先求數(shù)組中最大數(shù)的位數(shù)
       int max = arr[0];
       for(int i=1; i<arr.length; i++) {
        max = arr[i] > max ? arr[i] : max;
       }
       int maxLength = (max + "").length();
       // 2. 定義一個用來接收每一輪排序結(jié)果的數(shù)組
       int[] result = new int[arr.length];
       // 3. 定義一個長度為數(shù)據(jù)范圍的數(shù)組,每個數(shù)各數(shù)位只可能是0到9,所以數(shù)組長度為10
       int[] count = new int[10];
       // 4. 循環(huán)進行排序
       for(int i=0; i<maxLength; i++) {
        // 5. 第一輪求個位,第二輪求十位……,求個位:num / 1 % 10,求百位:num / 10 % 10……
        int division = (int)Math.pow(10, i); // 求10的次方
        // 從這里開始其實就是計數(shù)排序
        for(int j=0; j<arr.length; j++) {
         int num = arr[j] / division % 10;
         // num就是數(shù)組下標值,然后該下標對應的元素值加1。count數(shù)組下標和對應的值就表示該數(shù)出現(xiàn)了多少次
         count[num] ++;
        }
        // 6. 對count進行變形,使其變成穩(wěn)定的
        for(int x=1; x<count.length; x++) {
         count[x] += count[x-1];
        }
        // 7. 逆序遍歷原數(shù)組
        for(int y=arr.length-1; y>=0; y--) {
         int num = arr[y] / division % 10;
         result[count[num] - 1] = arr[y];
         count[num]--;
        }
        // 8. 拷貝result到原數(shù)組
        System.arraycopy(result, 0, arr, 0, arr.length);
        // 9. 清空count,進行下一輪的計數(shù)
        Arrays.fill(count, 0);
       }
      }

        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多