news 2026/4/21 13:34:55

C# (Median of an Array)数组的中位数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# (Median of an Array)数组的中位数

给定一个数组arr[],任务是找到该数组的中位数。大小为 n 的数组的中位数定义为:当 n 为奇数时,中位数为中间元素;当 n 为偶数时,中位数为中间两个元素的平均值。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

例如:

输入: arr[] = [12, 3, 5, 7, 4, 19, 26]

输出: 7

说明:给定数组 arr[] = [3, 4, 5, 7, 12, 19, 26] 的排序序列。由于元素个数为奇数,因此中位数是给定数组 arr[] 排序序列中的第 4 个元素,即 7。

输入: arr[] = [12, 3, 5, 7, 4, 26]

输出: 6

说明:由于元素个数为偶数,中位数是给定数组 arr[] 排序后的第 3 个元素和第 4 个元素的平均值,即 (5 + 7)/2 = 6

【朴素方法】通过对数组进行排序——时间复杂度为 O(n log n),空间复杂度为 O(1)

基本思路是对数组进行排序,并检查数组大小,如果数组大小为奇数则返回中间元素,否则返回中间两个元素的平均值。

using System;
using System.Linq;

class GfG {
static double FindMedian(int[] arr) {
int n = arr.Length;
// First we sort the array
Array.Sort(arr);

// check for even case
if (n % 2 != 0)
return arr[n / 2];

return (arr[(n - 1) / 2] + arr[n / 2]) / 2.0;
}

static void Main() {
int[] arr = { 1, 3, 4, 2, 7, 5, 8, 6 };
double ans = FindMedian(arr);
Console.WriteLine(ans);
}
}

输出

4.5

时间复杂度:O(n log n),因为我们需要先对数组进行排序。
辅助空间:O(1)

【预期方法】:使用随机快速选择

要找到数组的中位数,可以随机选择一个基准元素,然后使用快速排序算法对数组进行分区,将较小的元素放在左侧,较大的元素放在右侧。如果基准元素落在中间索引处,则该元素即为中位数。否则,递归地对相应的子数组应用此过程。对于偶数大小的数组,可以找到中间两个元素并计算它们的平均值。

using System;
using System.Linq;

class GfG {
static void Swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

public static int Partition(int[] arr, int l, int r) {
int lst = arr[r], i = l, j = l;
while (j < r) {
if (arr[j] < lst) {
Swap(arr, i, j);
i++;
}
j++;
}
Swap(arr, i, r);
return i;
}

public static int RandomPartition(int[] arr, int l, int r) {
Random rand = new Random();
int n = r - l + 1;
int pivot = rand.Next(n);
Swap(arr, l + pivot, r);
return Partition(arr, l, r);
}

public static void MedianUtil(int[] arr, int l, int r, int k, int[] a, int[] b) {
if (l <= r) {
int partitionIndex = RandomPartition(arr, l, r);
// find the median of odd number element in arr[]
if (partitionIndex == k) {
b[0] = arr[partitionIndex];
if (a[0] != -1) return;
} else if (partitionIndex == k - 1) { // a & b as middle element of arr[]
a[0] = arr[partitionIndex];
if (b[0] != -1) return;
}
// index in first half of the arr[]
if (partitionIndex >= k)
MedianUtil(arr, l, partitionIndex - 1, k, a, b);
// find the index in second half of the arr[]
else
MedianUtil(arr, partitionIndex + 1, r, k, a, b);
}
}

public static double FindMedian(int[] arr) {
double ans;
int[] a = {-1};
int[] b = {-1};
int n = arr.Length;

if (n % 2 == 1) {
MedianUtil(arr, 0, n - 1, n / 2, a, b);
ans = b[0];
} else {
MedianUtil(arr, 0, n - 1, n / 2, a, b);
ans = (a[0] + b[0]) / 2.0;
}
return ans;
}

public static void Main(string[] args) {
int[] arr = {12, 3, 6, 7, 4, 19};
Console.WriteLine(FindMedian(arr));
}
}

输出

6.5

时间复杂度:

  1. 最佳情况分析:O(1)
  2. 平均情况分析:O(n)
  3. 最坏情况分析:O(n 2 )

辅助空间:O(n)

【最坏情况线性时间方法】——使用顺序统计量

这种新方法的思路与 quickSelect() 类似。我们通过选择一个能够平衡分割数组的枢轴点(避免一侧元素极少而另一侧元素过多),来实现最坏情况下的线性时间复杂度。数组被平衡分割后,我们采用与 quickSelect() 相同的步骤来决定从枢轴点的左侧还是右侧进行选择。有关实现细节和更多详情,请参阅“无序数组中第 K 个最小/最大元素 | 最坏情况下的线性时间复杂度” 。

注意:虽然这种方法在理论上看起来不错,但之前的快速选择方法在实践中效果更好。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/21 13:33:15

8大网盘直链获取实战:从零到精通的本地化解析方案

8大网盘直链获取实战&#xff1a;从零到精通的本地化解析方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…

作者头像 李华
网站建设 2026/4/21 13:30:17

13、c#线程

1 简介 1.1 概念 进程&#xff1a;正在运行的程序 线程&#xff1a;正在运行的程序中 正在执行的代码块 ​比喻&#xff1a;进程是正在开工的工厂线程是正在运行的流水线一个进程中只要有一个线程&#xff1a;&#xff1a;&#xff1a;&#xff1a;&#xff1a;&#xff1a;&…

作者头像 李华
网站建设 2026/4/21 13:27:15

3分钟搞定DOL汉化美化:零基础也能玩转的终极整合方案

3分钟搞定DOL汉化美化&#xff1a;零基础也能玩转的终极整合方案 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 你是不是也遇到过这样的烦恼&#xff1f;想玩Degrees of Lewdity的中文版&#xff0…

作者头像 李华
网站建设 2026/4/21 13:27:09

Rust trait系统与泛型编程

Rust作为一门现代系统编程语言&#xff0c;其强大的类型系统和零成本抽象能力吸引了众多开发者。其中&#xff0c;trait系统与泛型编程是Rust最具特色的设计之一&#xff0c;它们不仅提供了灵活的代码复用机制&#xff0c;还能在编译期保证类型安全。本文将深入探讨Rust trait与…

作者头像 李华
网站建设 2026/4/21 13:25:14

【Excel提效 No.004】一句话搞定按条件拆分为多个独立Excel文件

目录 你是否也遇到过这些问题 处理效果 1. 前置准备 2. 超简单AI自动化解决方案 第1步:准备好你的原始数据 第2步:针对指定的文件下达指令 第3步:验收 还能解决这些同类问题 指令为什么这么有用? 更多场景直接抄作业 1. 按日期范围拆分 2. 按数值区间拆分 3. 按客户拆分并附…

作者头像 李华