|
// Copyright 2017-2018 DERO Project. All rights reserved.
|
|
// Use of this source code in any form is governed by RESEARCH license.
|
|
// license can be found in the LICENSE file.
|
|
// GPG: 0F39 E425 8C65 3947 702A 8234 08B2 0360 A03A 9DE8
|
|
//
|
|
//
|
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
|
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
|
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
package blockchain
|
|
|
|
import "sort"
|
|
|
|
type uint64arr []uint64
|
|
|
|
func (a uint64arr) Len() int { return len(a) }
|
|
func (a uint64arr) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
|
func (a uint64arr) Less(i, j int) bool { return a[i] < a[j] }
|
|
|
|
// Median gets the median number in a slice of uint64 numbers
|
|
// this function is used in so many checks that it should have unit tests for sure
|
|
// NOTE: it will the input array
|
|
|
|
func Median(inputs []uint64) (median uint64) {
|
|
|
|
// Start by sorting
|
|
sort.Sort(uint64arr(inputs))
|
|
|
|
// No math is needed if there are no numbers
|
|
// For even numbers we add the two middle numbers
|
|
// and divide by two using the mean function above
|
|
// For odd numbers we just use the middle number
|
|
l := len(inputs)
|
|
if l == 0 {
|
|
return 0
|
|
} else if l%2 == 0 {
|
|
median = (inputs[(l/2)-1] + inputs[(l/2)]) / 2
|
|
} else {
|
|
median = inputs[l/2]
|
|
}
|
|
|
|
return median
|
|
}
|