uopspop

Untitled

Sep 11th, 2017
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.83 KB | None | 0 0
  1. package sorting;
  2.  
  3. public class CountingSort {
  4.     public static void main(String[] args){
  5.         int k = 20; // 最大可能數值 // k > n
  6.        
  7.         int[] ary = new int[]{4,4,13,10,7,12,9,9};
  8.  
  9.         System.out.println("Original: ");
  10.         printAry(ary);
  11.        
  12.         // sorting
  13.         int[] sortedAry = countingSort(ary, k);
  14.        
  15.         // 印出結果
  16.         System.out.println("Sorted:");
  17.         printAry(sortedAry);
  18.     }
  19.    
  20.     /**
  21.      * time complexity: O(N + 2K)
  22.      * (n,k)
  23.      * @param ary
  24.      * @param maxVal
  25.      * @return
  26.      */
  27.     private static int[] countingSort(int[] ary, int maxVal) {
  28.        
  29.         int[] count = new int[maxVal+1]; // 初始值即為零
  30.         int[] sumCount = new int[maxVal+1];
  31.         int[] sortedAry = new int[ary.length];
  32.        
  33.         // 計算各個值出現幾次 (O(n))
  34.         for (int i = 0; i < ary.length; i++){
  35.             Integer val = ary[i];
  36.             count[val]++;
  37.         }
  38.         System.out.println("Counted:");
  39.         printAry(count);
  40.        
  41.         // 算出sumCount (O(k))
  42.         sumCount[0] = count[0];
  43.         for (int i = 1; i < count.length; i++){
  44.             sumCount[i] += (count[i] + sumCount[i-1]); // ("目前count[i]值" + "前一個sumCount[i]累積值")
  45.         }
  46.         System.out.println("sumCounted:");
  47.         printAry(sumCount);
  48.  
  49.         // 放入結果ary中 (O(k))
  50.         for (int i = 0; i < ary.length; i++){
  51.             int value = ary[i];
  52.             int indexForSortedAry = sumCount[value]--; // 拿完後要減掉,不然重複的值中,只會有一格一直被填
  53.             sortedAry[indexForSortedAry-1] = value; // 若不減一,最後結果最前面會多一個0
  54.         }
  55.        
  56.         return sortedAry;
  57.        
  58.     }
  59.    
  60.     private static void printAry(int[] ary){
  61.         for (int i = 0; i < ary.length; i++){
  62.             System.out.print(ary[i] + " ");
  63.         }
  64.         System.out.println();
  65.     }
  66.    
  67. }
  68. /**
  69.  *
  70. Original:
  71. 4 4 13 10 7 12 9 9
  72. Counted:
  73. 0 0 0 0 2 0 0 1 0 2 1 0 1 1 0 0 0 0 0 0 0
  74. sumCounted:
  75. 0 0 0 0 2 2 2 3 3 5 6 6 7 8 8 8 8 8 8 8 8
  76. Sorted:
  77. 4 4 7 9 9 10 12 13
  78.  */
Advertisement
Add Comment
Please, Sign In to add comment