排序演算法總結及面試題
阿新 • • 發佈:2019-02-11
// d為資料長度 private static void radixSorting(int[] arr, int d) { for (int i = 1; i <=d; i++) { int[] res = countingSort(arr, i); // 依次對各位數字排序(直接用計數排序的變體) for(int j=0;j<arr.length;j++){ arr[j]=res[j]; } } } // 利用計數排序對元素的每一位進行排序 private static int[] countingSort(int[] arr, int expIndex) { int k = 9; int[] b = new int[arr.length]; int[] c = new int[k + 1]; // 這裡比較特殊:數的每一位最大數為9 for (int i = 0; i < k; i++) { c[i] = 0; } for (int i = 0; i < arr.length; i++) { int d = getBitData(arr[i], expIndex); c[d]++; } for (int i = 1; i <= k; i++) { c[i] += c[i - 1]; } for (int i = arr.length - 1; i >= 0; i--) { int d = getBitData(arr[i], expIndex); b[c[d] - 1] = arr[i];// C[d]-1 就代表小於等於元素d的元素個數,就是d在B的位置 c[d]--; } return b; } // 獲取data指定位的數 private static int getBitData(int data, int expIndex) { while (data != 0 && expIndex > 0) { data /= 10; expIndex--; } return data % 10; } public static int[] countSort(int[] a){ int b[] = new int[a.length]; int max = a[0],min = a[0]; for(int i:a){ if(i>max) max=i; if(i<min) min=i; }//這裡k的大小是要排序的陣列中,元素大小的極值差+1 int k=max-min+1; int c[]=new int[k]; for(int i=0;i<a.length;++i){ c[a[i]-min]+=1;//優化過的地方,減小了陣列c的大小 } for(int i=1;i<c.length;++i){ c[i]=c[i]+c[i-1]; } for(int i=a.length-1;i>=0;--i){ b[--c[a[i]-min]]=a[i];//按存取的方式取出c的元素 } return b; }