我们接着上一篇继续讲【洛谷P1177【模板】排序:十种排序算法全解(1)】
三、计数排序(Counting Sort)
仅适用于数据范围较小的情况
// Java
import java.io.*;
public class Main {
static final int OFFSET = 100000;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String[] strs = br.readLine().split(" ");
int[] cnt = new int[200001];
for (int i = 0; i < n; i++)
cnt[Integer.parseInt(strs[i]) + OFFSET]++;
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= 200000; i++)
while (cnt[i]-- > 0) sb.append(i - OFFSET).append(" ");
System.out.println(sb);
}
}
# Python
n = int(input())
nums = list(map(int, input().split()))
min_val, max_val = min(nums), max(nums)
offset = -min_val
count = [0] * (max_val - min_val + 1)
for num in nums:
count[num + offset] += 1
sorted_arr = []
for i in range(len(count)):
sorted_arr.extend([i - offset] * count[i])
print(' '.join(map(str, sorted_arr)))
// C
#include <stdio.h>
#include <limits.h>
int main() {
int n;
scanf("%d", &n);
int min_val = INT_MAX, max_val = INT_MIN;
int arr[n];
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
if (arr[i] < min_val) min_val = arr[i];
if (arr[i] > max_val) max_val = arr[i];
}
int size = max_val - min_val + 1;
int* count = calloc(size, sizeof(int));
for (int i = 0; i < n; i++) count[arr[i] - min_val]++;
for (int i = 0; i < size; i++)
while (count[i]-- > 0) printf("%d ", i + min_val);
return 0;
}