summaryrefslogtreecommitdiff
path: root/kattis-kth-alginda-quicksort/radix.go
blob: d8475470988c98f9332c58c89b33a8c058fff89b (plain) (blame)
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
package main

import (
	"os"
)

var xs [600_000]int32
var ys [600_000]int32

func radixSort(n int) {
	ys, xs := xs[:n], ys[:n]
	for m := 0; m < 32; m += 8 {
		xs, ys = ys, xs

		var counts [256]int32
		for _, x := range xs {
			counts[x>>m&0xff]++
		}

		for i := 1; i < len(counts); i++ {
			counts[i] += counts[i-1]
		}

		for i := len(xs) - 1; i >= 0; i-- {
			counts[xs[i]>>m&0xff]--
			ys[counts[xs[i]>>m&0xff]] = xs[i]
		}
	}
}

var buf [600_000 * 12]byte

func main() {
	n, _ := os.Stdin.Read(buf[:])
	b := buf[:n]
	i := 0

	count := 0
	for ; b[i] != ' '; i++ {
		count = count*10 + int(b[i]-'0')
	}
	i++ // skip space

	for j := 0; j < count; j++ {
		x := int32(0)
		neg := false
		if b[i] == '-' {
			neg = true
			i++
		}
		for ; '0' <= b[i] && b[i] <= '9'; i++ {
			x = x*10 + int32(b[i]-'0')
		}
		i++ // skip space

		if neg {
			x = -x
		}
		var bit int32 = 1
		xs[j] = x ^ bit<<31
	}

	radixSort(count)

	b = buf[:]
	i = 600_000*12 - 1
	b[i] = '\n'
	i--
	for j := count - 1; j >= 0; j-- {
		var bit int32 = 1
		sx := xs[j] ^ bit<<31
		neg := sx < 0
		var x uint32
		if neg {
			x = uint32(-sx)
		} else {
			x = uint32(sx)
		}
		if x == 0 {
			b[i] = '0'
			i--
		}
		for x > 0 {
			b[i] = '0' + byte(x%10)
			x /= 10
			i--
		}
		if neg {
			b[i] = '-'
			i--
		}
		if j > 0 {
			b[i] = '\n'
			i--
		}
	}

	os.Stdout.Write(b[i+1:])
}