计数排序
计数排序(Counting Sort)是一种非比较排序算法,适用于范围较小的整数排序。它的基本思想是通过统计每个元素出现的次数,然后根据这些计数来确定每个元素在排序后数组中的位置。计数排序的时间复杂度为 O(n + k),其中 n 是待排序元素的数量,k 是元素值的范围。
以下是 Java 中实现计数排序的示例代码:
import java.util.Arrays;
public class CountingSort {
public static void countingSort(int[] arr) {
if (arr.length == 0) {
return; // 如果数组为空,直接返回
}
// 找到最大值和最小值
int max = Arrays.stream(arr).max().getAsInt();
int min = Arrays.stream(arr).min().getAsInt();
// 创建计数数组
int range = max - min + 1; // 计算范围
int[] count = new int[range];
int[] output = new int[arr.length];
// 统计每个元素的出现次数
for (int num : arr) {
count[num - min]++;
}
// 累加计数数组
for (int i = 1; i < count.length; i++) {
count[i] += count[i - 1];
}
// 构建输出数组
for (int i = arr.length - 1; i >= 0; i--) {
output[count[arr[i] - min] - 1] = arr[i];
count[arr[i] - min]--;
}
// 将输出数组复制回原数组
System.arraycopy(output, 0, arr, 0, arr.length);
}
public static void main(String[] args) {
int[] arr = {4, 2, 2, 8, 3, 3, 1};
System.out.println("原数组: " + Arrays.toString(arr));
countingSort(arr);
System.out.println("排序后数组: " + Arrays.toString(arr));
}
}
max - min + 1
,以便能够存储所有可能的元素。System.arraycopy
方法将排序后的结果复制回原数组。计数排序适用于以下情况: