-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path8.2-counting-sort.go
86 lines (68 loc) · 1.53 KB
/
8.2-counting-sort.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// 8.2-counting-sort
package main
import (
"fmt"
"math"
)
func main() {
A := []int{4, 1, 1, 3, 2, 2, 0, 0, 0}
sorted := countingSort(A, 4)
fmt.Println("A sorted:", sorted)
B := []int{121, 125, 100, 190, 130, 120, 155, 160, 140, 180}
fmt.Println("B sorted by 2 digit:", countingSortByDigit(B, 9, 2))
fmt.Println("B radix-sorted:", radixSort(B, 9, 3))
}
/**
countingSort sorts input array *A* using counting sort
Time complexity: O(len(A) + k)
- parameter A: input array
- parameter k: values of *A* should be in *0..k*
*/
func countingSort(A []int, k int) []int {
C := make([]int, k+1)
B := make([]int, len(A))
for j := 0; j < len(A); j++ {
C[A[j]]++
}
for i := 1; i <= k; i++ {
C[i] += C[i-1]
}
for j := len(A) - 1; j >= 0; j-- {
n := A[j]
B[C[n]-1] = n
C[n]--
}
return B
}
// 8.3-radix-sort
/**
countingSortByDigit sorts input array *A* using counting sort
Time complexity: O(len(A) + k)
- parameter A: input array
- parameter k: values of *A* should be in *0..k*
*/
func countingSortByDigit(A []int, k, d int) []int {
C := make([]int, k+1)
B := make([]int, len(A))
denominator := math.Pow(float64(k+1), float64(d-1))
for j := 0; j < len(A); j++ {
digit := (A[j] / int(denominator)) % (k + 1)
C[digit]++
}
for i := 1; i <= k; i++ {
C[i] += C[i-1]
}
for j := len(A) - 1; j >= 0; j-- {
digit := (A[j] / int(denominator)) % (k + 1)
B[C[digit]-1] = A[j]
C[digit]--
}
return B
}
func radixSort(A []int, k, d int) []int {
B := A
for i := 1; i <= d; i++ {
B = countingSortByDigit(B, k, i)
}
return B
}