1 public static void countingsort(int[] a, int n) //n = a.length 2 { 3 int max = a[0], min = a[0]; 4 for(int i = 1; i < a.length; i++) 5 { 6 if(a[i] > max) 7 max = a[i]; 8 if(a[i] < min) 9 min = a[i]; 10 } 11 int[] b = new int[max - min + 1]; 12 int[] c = new int[n]; 13 14 //获取频数 15 for(int i = 0; i < a.length; i++) 16 b[a[i] - min]++; 17 //得到a数组中每个元素的位置 18 for(int i = 1; i < b.length; i++) 19 b[i] += b[i - 1]; 20 //逆序遍历a数组 保证计数排序是稳定的 21 for(int i = a.length - 1; i >= 0; i--) 22 { 23 c[b[a[i] - min] - 1] = a[i]; 24 b[a[i] - min]--; 25 } 26 for(int i = 0; i < a.length; i++) 27 a[i] = c[i]; 28 }
排序算法的稳定性:若排序后的序列中多个相同元素的相对位置与原序列中相同,即在原序列中 a[i]=a[j] 且 a[i]在a[j]之前,而在排序后的序列中,a[i]仍在a[j]之前,则称该排序算法是稳定的,否则称为不稳定的。