每日一题——插入排序实现数据流中的中位数

server/2025/2/11 23:26:06/

插入排序实现数据流中的中位数

    • 题目描述
      • 功能要求
      • 数据范围
    • 解题思路
    • 代码实现
    • 代码详解
      • 1. 全局变量
      • 2. Insert 函数
      • 3. GetMedian 函数
    • 复杂度分析
      • Insert 函数
      • GetMedian 函数
      • 空间复杂度(整体)
    • 注意事项

题目描述

设计一个算法,用来计算数据流中的中位数。当数据流中读出奇数个数值时,中位数就是所有数值排序之后位于中间的数值;当数据流中读出偶数个数值时,中位数就是所有数值排序之后中间两个数的平均值。

功能要求

  • Insert(num):从数据流中读取一个整数,并将其插入到有序数组中
  • GetMedian():返回当前读取数据的中位数

数据范围

  • 数组大小限制:1000
  • 确保数据流中所有整数都在 int 范围内

解题思路

本题采用有序数组的方式实现,主要思路如下:

  1. 使用一个全局数组保存所有数据
  2. 每次插入时保持数组有序
  3. 根据数组长度的奇偶性计算中位数

算法流程

  1. 插入数据时,先将数据加入数组末尾
  2. 通过插入排序的方式维护数组有序性
  3. 获取中位数时,根据数组长度判断返回中间位置或中间两个数的平均值

代码实现

/*** 全局变量声明区*/
#include <math.h>// 定义一个固定大小的数组来存储数据流中的数字
int arr[1000];// 定义top指针,初始化为-1表示空数组
// top表示当前数组中最后一个元素的索引
int top = -1;/*** Insert函数:将新的数字插入到数组中,并保持数组有序* @param num: 要插入的新数字* @return: 无返回值* 算法思路:使用插入排序的思想,每次插入后保持数组有序*/
void Insert(int num) {// 先将新数字插入到数组末尾// ++top先自增再使用,所以先给top加1,再在新位置存入数字arr[++top] = num;// 使用插入排序的思想,将新插入的数字调整到正确的位置// i>0确保不会数组越界// arr[i]<arr[i-1]判断当前数字是否小于前一个数字for(int i = top; i > 0 && arr[i] < arr[i-1]; i--) {// 如果当前数字小于前一个数字,则交换它们的位置int temp = arr[i];        // 暂存当前数字arr[i] = arr[i-1];        // 将前一个数字后移arr[i-1] = temp;          // 将当前数字放到前一个位置}// 打印当前插入的结果// top表示当前位置,arr[top]表示当前位置的数字printf("arr%d=%d", top, arr[top]);
}/*** GetMedian函数:计算当前数组中所有数字的中位数* @param: 无参数* @return: 返回中位数,double类型* 算法思路:根据数组长度的奇偶性来决定返回中间一个数还是中间两个数的平均值*/
double GetMedian() {// 通过判断top的奇偶性来确定数组长度的奇偶性// top是索引,所以实际长度是top+1if(top % 2 == 0) {// 如果top是偶数,说明数组长度是奇数// 直接返回中间位置的数字// 需要转换为double类型以确保精确度return (double)arr[top/2];} else {// 如果top是奇数,说明数组长度是偶数// 返回中间两个数字的平均值// 使用2.0来进行浮点数除法,确保结果的精确度return (arr[top/2] + arr[top/2+1]) / 2.0;}
}

代码详解

1. 全局变量

int arr[1000];  // 存储数据的数组
int top = -1;   // 数组当前末尾索引
  • arr:用于存储所有插入的数据
  • top:记录当前数组最后一个元素的索引,初始为-1表示空数组

2. Insert 函数

void Insert(int num) {arr[++top] = num;for(int i = top; i > 0 && arr[i] < arr[i-1]; i--) {int temp = arr[i];arr[i] = arr[i-1];arr[i-1] = temp;}printf("arr%d=%d", top, arr[top]);
}

关键点解析:

  • 先将新数据加入数组末尾
  • 使用插入排序方法,将新插入的数据调整到正确位置
  • 打印输出当前插入的数据及其位置

3. GetMedian 函数

double GetMedian() {if(top % 2 == 0)return (double)arr[top/2];elsereturn (arr[top/2] + arr[top/2+1]) / 2.0;
}

关键点解析:

  • 通过判断top的奇偶性确定当前数组长度的奇偶性
  • 奇数个元素时返回中间位置的元素
  • 偶数个元素时返回中间两个数的平均值
  • 使用2.0确保进行浮点数除法

复杂度分析

Insert 函数

  • 时间复杂度:O(n),其中n为当前数组长度
  • 空间复杂度:O(1),只需要常数级别的额外空间

GetMedian 函数

  • 时间复杂度:O(1),直接访问数组元素
  • 空间复杂度:O(1)

空间复杂度(整体)

  • O(n),需要一个数组存储所有数据

注意事项

  1. 数组大小限制

    • 需要确保不会超过1000个元素
    • 实际应用中应考虑动态扩容
  2. 数值范围

    • 确保输入的整数在int范围内
    • 计算平均值时注意使用double避免精度损失
  3. 边界条件

    • 处理第一个数据时的特殊情况
    • 注意数组索引不要越界,基本上只要注意边界问题,插入排序整体上还是非常容易的

http://www.ppmy.cn/server/166879.html

相关文章

荣耀内置的远程控制怎样用?荣耀如何远程控制其他品牌的手机?

荣耀手机没有内置的远程控制功能&#xff0c;倒是有一项内置的【远程守护】功能&#xff0c;可以共享定位。如果家里的老人、小孩都使用荣耀手机&#xff0c;那么可以共享定位&#xff0c;随时知道人在哪&#xff0c;避免走丢。 荣耀手机【远程守护】功能的使用步骤&#xff1a…

数据中心网络架构 — 云网一体化数据中心网络 — 算力网络 — SDN 架构

算力网络 在 5G 及后 5G 时代&#xff0c;为了更迅捷高效地响应业务的计算需求&#xff0c;算力资源逐渐被下沉至靠近用户的边缘&#xff0c;并形成异构多样、分布式的算力部署新态势。 网络基础设施通过其成熟发达的连接感知触角&#xff0c;将多级分布的算力资源进行统一的…

【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统

项目介绍 本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…

wordpressAI工具,已接入Deepseek 支持自动生成文章、生成图片、生成长尾关键词、前端AI窗口互动、批量采集等

基于关键词或现有内容生成SEO优化的文章&#xff0c;支持多种AI服务&#xff08;如OpenAI、百度文心一言、智谱AI等&#xff09;&#xff0c;并提供定时任务、内容采集、关键词生成等功能。 核心功能 文章生成 关键词生成&#xff1a;根据输入的关键词生成高质量文章。 内容…

Scala语言的区块链

以Scala语言的区块链 随着数字货币和去中心化应用的兴起&#xff0c;区块链技术逐渐成为计算机科学与金融科技领域中的一颗耀眼明星。区块链以其去中心化、不可篡改、透明可信等特性&#xff0c;吸引了无数开发者与企业的关注。在众多编程语言中&#xff0c;Scala凭借其独特的…

OpenEuler学习笔记(二十三):在OpenEuler上部署开源MES系统

在OpenEuler上部署小企业开源MES&#xff08;制造执行系统&#xff0c;Manufacturing Execution System&#xff09;是一个非常有价值的项目&#xff0c;可以帮助企业实现生产过程的数字化管理。以下是基于开源MES系统&#xff08;如 Odoo MES 或 OpenMES&#xff09;的部署步骤…

PH热榜 | 2025-02-10

1. 2pr 标语&#xff1a;人工智能帮你把想法变成LinkedIn爆款 或者更口语化一点&#xff1a; AI帮你把点子变成LinkedIn上的热门帖子 介绍&#xff1a;用AI主持的访谈&#xff0c;把你的想法变成LinkedIn爆款帖子。录制你的想法&#xff0c;让AI帮你创作个性化、引人入胜的…

C++ list介绍

文章目录 1. list简介2. list的实现框架2.1 链表结点2.2 链表迭代器2.3 链表 3. list迭代器及反向迭代器设计3.1 list迭代器3.2 list反向迭代器3.3 list迭代器失效 4. list与vector比较 1. list简介 list&#xff0c;即链表。 链表的种类有很多&#xff0c;是否带头结点&#…