Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix counting sort #1065

Merged
merged 2 commits into from
Jun 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions basic/sorting/CountingSort/CountingSort.go
Original file line number Diff line number Diff line change
@@ -1,26 +1,54 @@
package main

import (
"fmt"
"log"
"time"
)

func CountingSort(nums []int, min, max int) {
n := len(nums)
k := max - min + 1
c := make([]int, k)
for _, v := range nums {
c[v-min]++
}
log.Println(c)

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

r := make([]int, n)
for i := n - 1; i >= 0; i-- {
v := nums[i]
a := c[v]
r[a-1] = v + min
c[v]--
a := c[v-min]
r[a-1] = v
c[v-min]--
log.Println(r)
}

for i, v := range r {
nums[i] = v
}
}
log.Println(nums)
}

func main() {
// uncomment following line to enable log print
// log.SetOutput(io.Discard)

// test case 1
nums := []int{1, 2, 7, 9, 5, 5, 8}
CountingSort(nums, 1, 9)
fmt.Println(nums)

// wait complete output to terminal
time.Sleep(time.Second)

// test case 2
nums = []int{3, 7, 9, 5, 5, 8, 11}
CountingSort(nums, 3, 11)
fmt.Println(nums)
}
27 changes: 22 additions & 5 deletions basic/sorting/CountingSort/CountingSort.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,38 @@
import java.util.Arrays;

public class CountingSort {
public static void sort(int[] nums, int min, int max) {
public static void countingSort(int[] nums, int min, int max) {
int n = nums.length;
int k = max - min + 1;
int[] c = new int[k];
for (int v : nums) {
c[v - min]++;
}

for (int i = 1; i < k; i++) {
c[i] += c[i - 1];
}

int[] r = new int[n];
for (int i = n - 1; i >= 0; i--) {
int v = nums[i];
int a = c[v];
r[a - 1] = v + min;
c[v]--;
int a = c[v - min];
r[a - 1] = v;
c[v - min]--;
}
System.arraycopy(r, 0, nums, 0, n);
}
}

public static void main(String[] args) {

// test case 1
int[] nums = {1, 2, 7, 9, 5, 5, 8};
countingSort(nums, 1, 9);
System.out.println(Arrays.toString(nums));

// test case 2
int[] nums2 = {2, 7, 9, 5, 5, 8};
countingSort(nums2, 2, 9);
System.out.println(Arrays.toString(nums2));
}
}
61 changes: 0 additions & 61 deletions basic/sorting/CountingSort/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,67 +10,6 @@
- 创建结果数组 `r`,起始索引 `i`
- 遍历数组 `c`,找出其中元素大于 `0` 的元素,将其对应的索引作为元素值填充到 `r` 数组中,每处理一次,`c` 中的元素值减 `1`,直到该元素值不大于 `0`,依次处理 `c` 中剩下的元素

## 代码示例

<!-- tabs:start -->

### **Java**

```java
public class CountingSort {
public static void sort(int[] nums, int min, int max) {
int n = nums.length;
int k = max - min + 1;
int[] c = new int[k];
for (int v : nums) {
c[v - min]++;
}
for (int i = 1; i < k; i++) {
c[i] += c[i - 1];
}
int[] r = new int[n];
for (int i = n - 1; i >= 0; i--) {
int v = nums[i];
int a = c[v];
r[a - 1] = v + min;
c[v]--;
}
System.arraycopy(r, 0, nums, 0, n);
}
}
```

### **Go**

```go
func CountingSort(nums []int, min, max int) {
n := len(nums)
k := max - min + 1
c := make([]int, k)
for _, v := range nums {
c[v-min]++
}

for i := 1; i < k; i++ {
c[i] += c[i-1]
}

r := make([]int, n)
for i := n - 1; i >= 0; i-- {
v := nums[i]
a := c[v]
r[a-1] = v + min
c[v]--
}

for i, v := range r {
nums[i] = v
}
}
```

<!-- tabs:end -->

## 算法分析

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