Java排序之計數排序

scu醬油仔發表於2019-01-19

Java排序之計數排序

1. 計數排序思路

計數排序適用於有明確範圍的陣列,比如給定一個陣列,且知道所有值得範圍是[m,n]。這個時候可以使用一個n-m+1長度的陣列,待排序的陣列就可以散在這個陣列上,陣列的值就是當前值的個數,再經過一次遍歷展開,得到的陣列就有序了。

  1. 新建一個長度為n-m+1的臨時陣列
  2. 遍歷待排序陣列,它的值-m作為臨時陣列下角標,這個位置的值加1
  3. 遍歷結束,臨時陣列就儲存了每個值得個數
  4. 最後將它展開賦值給原陣列

2. Java程式碼實現

package com.wangjun.arithmetic;

import java.util.Arrays;

public class SortCount {

    public static void main(String[] args) {
        //測試
        int[] arr = {1,4,6,7,5,4,3,2,1,4,5,10,9,10,3};
        sortCount(arr, 1, 10);
        System.out.println(Arrays.toString(arr));
    }
    
    //計數排序的初步實現,使用了多餘的空間,可以嘗試不使用多餘的空間
    public static void sortCount(int[] arr, int m, int n) {
        int len = arr.length;
        int[] tem = new int[n - m + 1];
        for(int i = 0; i < len; i++) {
            tem[arr[i] - m] += 1;
        }
        for(int i = 0, index = 0; i < tem.length; i++) {
            int item = tem[i];
            while(item-- != 0) {
                arr[index++] = i + m;
            }
        }
    }

}

列印結果:

[1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 9, 10, 10]

相關文章