-
Notifications
You must be signed in to change notification settings - Fork 1
/
day_61_median_of_median.go
64 lines (54 loc) · 1.2 KB
/
day_61_median_of_median.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
package main
import (
"fmt"
"sort"
)
func median_of_medians(arr []int, k, r int) int {
num := len(arr)
if num < 10 {
sort.Ints(arr)
return arr[k-1]
}
med := (num + r - 1) / r
medians := make([]int, med)
for i := 0; i < med; i++ {
v := (i * r) + r
var arr []int
if v >= num {
arr = make([]int, len(arr[(i*r):]))
copy(arr, arr[(i*r):])
} else {
arr = make([]int, r)
copy(arr, arr[(i*r):v])
}
sort.Ints(arr)
medians[i] = arr[len(arr)/2]
}
pivot := median_of_medians(medians, (len(medians)+1)/2, r)
var leftSide, rightSide []int
for i := range arr {
if arr[i] < pivot {
leftSide = append(leftSide, arr[i])
} else if arr[i] > pivot {
rightSide = append(rightSide, arr[i])
}
}
switch {
case k == (len(leftSide) + 1):
return pivot
case k <= len(leftSide):
return median_of_medians(leftSide, k, r)
default:
return median_of_medians(rightSide, k-len(leftSide)-1, r)
}
}
func main() {
arr := []int{1, 3, 543, 55, 65, 76, 7, 67, 876, 9, 8, 756, 46, 345, 32, 4, 234, 32, 12, 54}
sort.Ints(arr)
for _, j := range []int{5, 10, 15, 20} {
i := median_of_medians(arr, j, 5)
fmt.Println(j, "smallest : ", i)
v := arr[j-1]
fmt.Println("arr[", j-1, "] = ", v)
}
}