diff --git a/Sorting/Radix Sort/golang/radixsort.go b/Sorting/Radix Sort/golang/radixsort.go new file mode 100644 index 000000000..b7d5f9ff9 --- /dev/null +++ b/Sorting/Radix Sort/golang/radixsort.go @@ -0,0 +1,49 @@ +// Radix Sort in Golang +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 + } +} \ No newline at end of file