输入数组: [4, 2, 2, 8, 3, 3, 1]
数据范围: min=1, max=8, k=8
┌─────────────────────────────────────────────────────┐
│ 第一步: 统计每个元素出现次数 │
└─────────────────────────────────────────────────────┘
值: 1 2 3 4 5 6 7 8
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
输入: 4 2 2 8 3 3 1
统计过程:
arr[0]=4 → count[4]++ → count[4]=1
arr[1]=2 → count[2]++ → count[2]=1
arr[2]=2 → count[2]++ → count[2]=2
arr[3]=8 → count[8]++ → count[8]=1
arr[4]=3 → count[3]++ → count[3]=1
arr[5]=3 → count[3]++ → count[3]=2
arr[6]=1 → count[1]++ → count[1]=1
count数组: [1, 2, 2, 1, 0, 0, 0, 1]
↑ ↑ ↑ ↑ ↑
1 2 3 4 ... 8
┌─────────────────────────────────────────────────────┐
│ 第二步: 计算前缀和(累计计数) │
└─────────────────────────────────────────────────────┘
前缀和计算:
count[1] = 1 (值为1的元素位置: 0)
count[2] = 1+2 = 3 (值为2的元素位置: 1-2)
count[3] = 3+2 = 5 (值为3的元素位置: 3-4)
count[4] = 5+1 = 6 (值为4的元素位置: 5)
count[5] = 6+0 = 6
count[6] = 6+0 = 6
count[7] = 6+0 = 6
count[8] = 6+1 = 7 (值为8的元素位置: 6)
累计数组: [1, 3, 5, 6, 6, 6, 6, 7]
位置含义: count[i]表示值i的最后一个元素的位置+1
即值i应该放在位置count[i]-1
┌─────────────────────────────────────────────────────┐
│ 第三步: 从后向前遍历,将元素放到正确位置 │
└─────────────────────────────────────────────────────┘
从后向前遍历(保证稳定性):
i=6: arr[6]=1
pos = count[1]-1 = 0
output[0] = 1, count[1] = 0
output: [1, _, _, _, _, _, _]
i=5: arr[5]=3
pos = count[3]-1 = 4
output[4] = 3, count[3] = 4
output: [1, _, _, _, 3, _, _]
i=4: arr[4]=3
pos = count[3]-1 = 3
output[3] = 3, count[3] = 3
output: [1, _, _, 3, 3, _, _]
i=3: arr[3]=8
pos = count[8]-1 = 6
output[6] = 8, count[8] = 6
output: [1, _, _, 3, 3, _, 8]
i=2: arr[2]=2
pos = count[2]-1 = 2
output[2] = 2, count[2] = 2
output: [1, _, 2, 3, 3, _, 8]
i=1: arr[1]=2
pos = count[2]-1 = 1
output[1] = 2, count[2] = 1
output: [1, 2, 2, 3, 3, _, 8]
i=0: arr[0]=4
pos = count[4]-1 = 5
output[5] = 4, count[4] = 5
output: [1, 2, 2, 3, 3, 4, 8]
最终结果: [1, 2, 2, 3, 3, 4, 8]