-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathradixsort.go
114 lines (89 loc) · 1.73 KB
/
radixsort.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package radixsort
import (
"container/list"
"fmt"
"math"
"sort"
)
func digit(n, pos int) int {
if pos <= 0 || pos > 70 {
return -1
}
return (n / int(math.Pow10(pos-1))) % 10
}
func amountDigits(n int) int {
return int(math.Log10(float64(n))) + 1
}
//
func RadixSort(data []int) {
if sort.IntsAreSorted(data) {
return
}
var max_digit int
origin := list.New()
for ix, size := 0, len(data); ix < size; ix++ {
if ad := amountDigits(data[ix]); ad > max_digit {
max_digit = ad
}
origin.PushBack(data[ix])
}
r := radixSort(origin, max_digit)
for ix, elem := 0, r.Front(); elem != nil; ix, elem = ix+1, elem.Next() {
data[ix] = elem.Value.(int)
}
}
func radixSort(data *list.List, position int) *list.List {
if position == 0 || data.Len() <= 1 {
return data
}
var bucket [10]*list.List
for elem := data.Front(); elem != nil; elem = elem.Next() {
d := digit(elem.Value.(int), position)
if bucket[d] == nil {
bucket[d] = list.New()
}
bucket[d].PushBack(elem.Value)
}
output := make(chan *capsule, 10)
var count int
for ix, queue := range bucket {
if queue == nil {
continue
}
count++
go func(i int, q *list.List, out chan *capsule) {
l := radixSort(q, position-1)
out <- &capsule{
index: i,
list: l,
}
}(ix, queue, output)
}
var all [10]*list.List
for ; count > 0; count-- {
cr := <-output
all[cr.index] = cr.list
}
result := list.New()
for _, l := range all {
if l == nil {
continue
}
result.PushBackList(l)
}
return result
}
func printList(l *list.List) {
if l == nil {
fmt.Println("[Empty]")
return
}
for e := l.Front(); e != nil; e = e.Next() {
fmt.Print(e.Value, " ")
}
fmt.Println()
}
type capsule struct {
index int
list *list.List
}