You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
956 B
Go
48 lines
956 B
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/binary"
|
|
"fmt"
|
|
)
|
|
|
|
const digit = 4
|
|
const maxbit = -1 << 31
|
|
|
|
func main() {
|
|
|
|
var data = []int32{421, 15, -175, 90, -2, 214, -52, -166}
|
|
fmt.Println("\n--- Unsorted --- \n\n", data)
|
|
radixsort(data)
|
|
fmt.Println("\n--- Sorted ---\n\n", data, "\n")
|
|
}
|
|
|
|
func radixsort(data []int32) {
|
|
buf := bytes.NewBuffer(nil)
|
|
ds := make([][]byte, len(data))
|
|
for i, e := range data {
|
|
binary.Write(buf, binary.LittleEndian, e^maxbit)
|
|
b := make([]byte, digit)
|
|
buf.Read(b)
|
|
ds[i] = b
|
|
}
|
|
countingSort := make([][][]byte, 256)
|
|
for i := 0; i < digit; i++ {
|
|
for _, b := range ds {
|
|
countingSort[b[i]] = append(countingSort[b[i]], b)
|
|
}
|
|
j := 0
|
|
for k, bs := range countingSort {
|
|
copy(ds[j:], bs)
|
|
j += len(bs)
|
|
countingSort[k] = bs[:0]
|
|
}
|
|
}
|
|
var w int32
|
|
for i, b := range ds {
|
|
buf.Write(b)
|
|
binary.Read(buf, binary.LittleEndian, &w)
|
|
data[i] = w ^ maxbit
|
|
}
|
|
}
|