计数排序
计数排序(Counting Sort)不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
算法描述
- 找出待排序的数组中最大和最小的元素;
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
动图演示
07.gif实例
- 代码实现
public class CountingTest {
public static void main(String[] args) {
int[] a = {5, 4, 6, 7, 5, 1, 0, 9, 8, 1};
System.out.println("初始值:");
printArray(a);
countSort(a);
System.out.println("\n排序后:");
printArray(a);
}
public static void countSort(int[] arr) {
int[] count = new int[10];
for (int i = 0; i < arr.length; i++) {
count[arr[i]]++; // 计数每个元素出现次数
}
int index = 0;
for (int i = 0; i < count.length; i++) {
while (count[i] > 0) {
arr[index++] = i;
count[i]--;
}
}
}
private static void printArray(int[] a) {
for (int i = 0;i < a.length;i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
}
-
输出结果
03.png
网友评论