若是在面試中有面試官要求你寫一個O(n)時間複雜度的排序算法,你千萬不要馬上說:這不可能!雖然前面基於比較的排序的下限是O(nlogn)。可是確實也有線性時間複雜度的排序,只不過有前提條件,就是待排序的數要知足必定的範圍的整數,並且計數排序須要比較多的輔助空間。其基本思想是,用待排序的數做爲計數數組的下標,統計每一個數字的個數。而後依次輸出便可獲得有序序列。 面試
實現代碼:
public class CountSort { public static void countSort(int[] arr) { if(arr == null || arr.length == 0) return ; int max = max(arr); int[] count = new int[max+1]; Arrays.fill(count, 0); for(int i=0; i) { count[arr[i]] ++; } int k = 0; for(int i=0; i) { for(int j=0; j) { arr[k++] = i; } } } public static int max(int[] arr) { int max = Integer.MIN_VALUE; for(int ele : arr) { if(ele > max) max = ele; } return max; } }