Skip to content

Commit 3d04096

Browse files
authored
fix: counting sort algorithm (#1065)
1 parent 42e7675 commit 3d04096

File tree

3 files changed

+54
-70
lines changed

3 files changed

+54
-70
lines changed
+32-4
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,54 @@
11
package main
22

3+
import (
4+
"fmt"
5+
"log"
6+
"time"
7+
)
8+
39
func CountingSort(nums []int, min, max int) {
410
n := len(nums)
511
k := max - min + 1
612
c := make([]int, k)
713
for _, v := range nums {
814
c[v-min]++
915
}
16+
log.Println(c)
1017

1118
for i := 1; i < k; i++ {
1219
c[i] += c[i-1]
1320
}
21+
log.Println(c)
1422

1523
r := make([]int, n)
1624
for i := n - 1; i >= 0; i-- {
1725
v := nums[i]
18-
a := c[v]
19-
r[a-1] = v + min
20-
c[v]--
26+
a := c[v-min]
27+
r[a-1] = v
28+
c[v-min]--
29+
log.Println(r)
2130
}
2231

2332
for i, v := range r {
2433
nums[i] = v
2534
}
26-
}
35+
log.Println(nums)
36+
}
37+
38+
func main() {
39+
// uncomment following line to enable log print
40+
// log.SetOutput(io.Discard)
41+
42+
// test case 1
43+
nums := []int{1, 2, 7, 9, 5, 5, 8}
44+
CountingSort(nums, 1, 9)
45+
fmt.Println(nums)
46+
47+
// wait complete output to terminal
48+
time.Sleep(time.Second)
49+
50+
// test case 2
51+
nums = []int{3, 7, 9, 5, 5, 8, 11}
52+
CountingSort(nums, 3, 11)
53+
fmt.Println(nums)
54+
}
+22-5
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,38 @@
1+
import java.util.Arrays;
2+
13
public class CountingSort {
2-
public static void sort(int[] nums, int min, int max) {
4+
public static void countingSort(int[] nums, int min, int max) {
35
int n = nums.length;
46
int k = max - min + 1;
57
int[] c = new int[k];
68
for (int v : nums) {
79
c[v - min]++;
810
}
11+
912
for (int i = 1; i < k; i++) {
1013
c[i] += c[i - 1];
1114
}
15+
1216
int[] r = new int[n];
1317
for (int i = n - 1; i >= 0; i--) {
1418
int v = nums[i];
15-
int a = c[v];
16-
r[a - 1] = v + min;
17-
c[v]--;
19+
int a = c[v - min];
20+
r[a - 1] = v;
21+
c[v - min]--;
1822
}
1923
System.arraycopy(r, 0, nums, 0, n);
2024
}
21-
}
25+
26+
public static void main(String[] args) {
27+
28+
// test case 1
29+
int[] nums = {1, 2, 7, 9, 5, 5, 8};
30+
countingSort(nums, 1, 9);
31+
System.out.println(Arrays.toString(nums));
32+
33+
// test case 2
34+
int[] nums2 = {2, 7, 9, 5, 5, 8};
35+
countingSort(nums2, 2, 9);
36+
System.out.println(Arrays.toString(nums2));
37+
}
38+
}

basic/sorting/CountingSort/README.md

-61
Original file line numberDiff line numberDiff line change
@@ -10,67 +10,6 @@
1010
- 创建结果数组 `r`,起始索引 `i`
1111
- 遍历数组 `c`,找出其中元素大于 `0` 的元素,将其对应的索引作为元素值填充到 `r` 数组中,每处理一次,`c` 中的元素值减 `1`,直到该元素值不大于 `0`,依次处理 `c` 中剩下的元素
1212

13-
## 代码示例
14-
15-
<!-- tabs:start -->
16-
17-
### **Java**
18-
19-
```java
20-
public class CountingSort {
21-
public static void sort(int[] nums, int min, int max) {
22-
int n = nums.length;
23-
int k = max - min + 1;
24-
int[] c = new int[k];
25-
for (int v : nums) {
26-
c[v - min]++;
27-
}
28-
for (int i = 1; i < k; i++) {
29-
c[i] += c[i - 1];
30-
}
31-
int[] r = new int[n];
32-
for (int i = n - 1; i >= 0; i--) {
33-
int v = nums[i];
34-
int a = c[v];
35-
r[a - 1] = v + min;
36-
c[v]--;
37-
}
38-
System.arraycopy(r, 0, nums, 0, n);
39-
}
40-
}
41-
```
42-
43-
### **Go**
44-
45-
```go
46-
func CountingSort(nums []int, min, max int) {
47-
n := len(nums)
48-
k := max - min + 1
49-
c := make([]int, k)
50-
for _, v := range nums {
51-
c[v-min]++
52-
}
53-
54-
for i := 1; i < k; i++ {
55-
c[i] += c[i-1]
56-
}
57-
58-
r := make([]int, n)
59-
for i := n - 1; i >= 0; i-- {
60-
v := nums[i]
61-
a := c[v]
62-
r[a-1] = v + min
63-
c[v]--
64-
}
65-
66-
for i, v := range r {
67-
nums[i] = v
68-
}
69-
}
70-
```
71-
72-
<!-- tabs:end -->
73-
7413
## 算法分析
7514

7615
- 时间复杂度 $O(n+k)$, 其中 $n$ 为排序数组长度,而 $k$ 为排序数组中数值的取值范围,当 $k\lt n$ 时,时间复杂度为 $O(n)$。

0 commit comments

Comments
 (0)