June 2018 Update
This commit is contained in:
parent
ba8067c3b7
commit
22f33d4004
5278 changed files with 84726 additions and 14379 deletions
31
Task/Averages-Median/Go/averages-median-2.go
Normal file
31
Task/Averages-Median/Go/averages-median-2.go
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
fmt.Println(median([]float64{3, 1, 4, 1})) // prints 2
|
||||
fmt.Println(median([]float64{3, 1, 4, 1, 5})) // prints 3
|
||||
}
|
||||
|
||||
func median(a []float64) float64 {
|
||||
half := len(a) / 2
|
||||
med := sel(a, half)
|
||||
if len(a)%2 == 0 {
|
||||
return (med + a[half-1]) / 2
|
||||
}
|
||||
return med
|
||||
}
|
||||
|
||||
func sel(list []float64, k int) float64 {
|
||||
for i, minValue := range list[:k+1] {
|
||||
minIndex := i
|
||||
for j := i + 1; j < len(list); j++ {
|
||||
if list[j] < minValue {
|
||||
minIndex = j
|
||||
minValue = list[j]
|
||||
list[i], list[minIndex] = minValue, list[i]
|
||||
}
|
||||
}
|
||||
}
|
||||
return list[k]
|
||||
}
|
||||
52
Task/Averages-Median/Go/averages-median-3.go
Normal file
52
Task/Averages-Median/Go/averages-median-3.go
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println(median([]float64{3, 1, 4, 1})) // prints 2
|
||||
fmt.Println(median([]float64{3, 1, 4, 1, 5})) // prints 3
|
||||
}
|
||||
|
||||
func median(list []float64) float64 {
|
||||
half := len(list) / 2
|
||||
med := qsel(list, half)
|
||||
if len(list)%2 == 0 {
|
||||
return (med + qsel(list, half-1)) / 2
|
||||
}
|
||||
return med
|
||||
}
|
||||
|
||||
func qsel(a []float64, k int) float64 {
|
||||
for len(a) > 1 {
|
||||
px := rand.Intn(len(a))
|
||||
pv := a[px]
|
||||
last := len(a) - 1
|
||||
a[px], a[last] = a[last], pv
|
||||
px = 0
|
||||
for i, v := range a[:last] {
|
||||
if v < pv {
|
||||
a[px], a[i] = v, a[px]
|
||||
px++
|
||||
}
|
||||
}
|
||||
if px == k {
|
||||
return pv
|
||||
}
|
||||
if k < px {
|
||||
a = a[:px]
|
||||
} else {
|
||||
// swap elements. simply assigning a[last] would be enough to
|
||||
// allow qsel to return the correct result but it would leave slice
|
||||
// "a" unusable for subsequent use. we want this full swap so that
|
||||
// we can make two successive qsel calls in the case of median
|
||||
// of an even number of elements.
|
||||
a[px], a[last] = pv, a[px]
|
||||
a = a[px+1:]
|
||||
k -= px + 1
|
||||
}
|
||||
}
|
||||
return a[0]
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue