Golang 程序实现中位数的中位数

go programmingserver side programmingprogramming更新于 2025/5/1 6:07:17

中位数是数据集排序后位于中间的元素。中位数算法是一种强大的技术,用于找出未排序数组中的中位数元素。在本文中,我们将在 go 语言中实现中位数算法,使用两种方法,即递归方法和迭代方法。

解释

中位数算法是一种确定未排序数组中位数的有效技术。它引入了两种不同的方法:递归方法和迭代方法。

递归方法:引入 findMedianRecursive 函数以递归方式计算中位数。如果数组大小较小(5 个或更少的元素),它会排序并返回中间值。对于较大的数组,该函数会计算子数组中位数,选择中位数的中位数作为枢轴,并根据枢轴对数组进行分区。该过程不断重复,直到确定最终的中位数。

未排序数组:[9, 4, 7, 2, 8, 1, 6, 5, 3]
排序数组:[1, 2, 3, 4, 5, 6, 7, 8, 9]
输出:5

迭代方法:程序提供 findMedianIterative 函数,该函数迭代地将数组分解为大小为 5 的子数组。它计算子数组中位数,使用这些中位数更新数组,并迭代直到确定最终中位数。

算法

  • 如果数组 arr 的长度小于或等于 5,则对数组进行排序并返回中间元素作为中位数。将数组 arr 分成大小为 5 的子数组,但最后一个子数组除外,因为它的元素可能更少。

  • 对每个子数组递归应用中位数算法来找到它们的中位数。找到上一步中获得的中位数的中位数,它将成为枢轴元素。

  • 根据枢轴元素对原始数组 arr 进行分区,将较小的元素放在左侧,将较大的元素放在右侧。

  • 如果枢轴元素位于索引 k,则将 k 与所需的中位数索引进行比较:如果 k 等于所需的中位数索引,则返回枢轴元素作为中位数。如果 k 大于所需的中位数索引,则在左侧子数组上递归应用中位数算法。

  • 如果 k 小于所需的中位数索引,则在右侧子数组上递归应用中位数算法。重复该过程,直到找到所需的中位数。

语法

func findMedianRecursive(arr []int) int

该语法定义了一个名为 findMedianRecursive 的函数,该函数以整数切片 arr 作为输入。该函数旨在返回一个表示中位数元素的整数。

func findMedianIterative(arr []int) int

该语法声明了一个名为 findMedianIterative 的函数,该函数接受整数切片 arr 作为参数。通过使用中位数算法的迭代方法,此函数迭代计算并返回所提供的未排序数组的中位数。

示例

在此示例中,我们将使用递归方法在 go 语言中实现中位数算法来查找未排序数组的中位数,这里我们有一个未排序数组 arr,其元素为 [9, 4, 7, 2, 8, 1, 6, 5, 3]。我们调用 findMedianRecursive 函数,将数组作为输入传递。该函数应用中位数算法的递归方法来查找中位数。计算出的中位数为 5,然后将其打印为输出。

package main

import (
	"fmt"
	"sort"
)

func findMedianRecursive(arr []int) int {
	length := len(arr)

	if length <= 5 {
		sort.Ints(arr)
		return arr[length/2]
	}

	numGroups := length / 5
	if length%5 != 0 {
		numGroups++
	}

	medians := make([]int, numGroups)

	for i := 0; i < numGroups; i++ {
		start := i * 5
		end := start + 5
		if end > length {
			end = length
		}
		subarray := arr[start:end]
		medians[i] = findMedianRecursive(subarray)
	}

	pivot := findMedianRecursive(medians)

	left := make([]int, 0)
	right := make([]int, 0)
	equal := make([]int, 0)
	for _, num := range arr {
		if num < pivot {
			left = append(left, num)
		} else if num > pivot {
			right = append(right, num)
		} else {
			equal = append(equal, num)
		}
	}

	desiredIndex := len(left)

	if desiredIndex < len(left) {
		return findMedianRecursive(left)
	} else if desiredIndex >= len(left)+len(equal) {
		return findMedianRecursive(right)
	} else {
		return pivot
	}
}

func main() {
	arr := []int{9, 4, 7, 2, 8, 1, 6, 5, 3}
	median := findMedianRecursive(arr)
	fmt.Println("Median:", median)
}

输出

Median: 7

示例

在此示例中,我们将使用 go 语言实现中位数算法,使用迭代方法查找未排序数组的中位数,这里我们有一个未排序数组 [9, 4, 7, 2, 8, 1, 6, 5, 3]。通过应用中位数算法的迭代方法,我们计算出中位数为 5。此方法涉及将数组划分为子数组,计算它们的中位数,并递归缩小范围,直到找到所需的中位数。

package main

import (
	"fmt"
	"sort"
)

func findMedianIterative(arr []int) int {
	length := len(arr)

	for length > 5 {
		medians := make([]int, 0)
		numGroups := length / 5

		if length%5 != 0 {
			numGroups++
		}

		for i := 0; i < numGroups; i++ {
			start := i * 5
			end := start + 5
			if end > length {
				end = length
			}
			subarray := arr[start:end]
			sort.Ints(subarray)
			medians = append(medians, subarray[len(subarray)/2])
		}

		arr = medians
		length = len(arr)
	}

	sort.Ints(arr)
	return arr[length/2]
}

func main() {
	arr := []int{9, 4, 7, 2, 8, 1, 6, 5, 3}
	median := findMedianIterative(arr)
	fmt.Println("Median:", median)
}

输出

Median: 7

实际应用

医学诊断

在医学诊断中,中位数算法可用于查找患者数据的中位数,例如血压读数或胆固醇水平。这有助于医生识别趋势并做出明智的决定,确保准确评估患者的健康状况。

财务分析

财务分析师可以将该算法应用于股票价格或经济指标的大型数据集。这有助于确定中位数,提供对市场趋势和稳定性的洞察,尤其是当异常值可能会扭曲结果时。

结论

中位数算法是一种强大的技术,在医院中可以非常有效地找到患者数据的中位数,对于财务分析师来说,它可以非常有效地找到数据集。在本文中,我们研究了如何在 go 语言中实现中位数算法,并在未排序数组中找到中位数元素。这里我们研究了两种方法:递归方法和迭代方法。这些方法提供了计算中位数的有效方法,时间复杂度为 O(n)。


相关文章