当前位置: 首页 > news >正文

王道p18 第12题假设 A中的 n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素:否则输出-1

 视频讲解在:👇

p18 第12题 c语言实现王道数据结构课后习题_哔哩哔哩_bilibili

从前向后扫描数组元素,标记出一个可能成为主元素的元素 Num。然后重新计数,确认 Num 是否是主元素。

我们可分为以下两步:
1.选取候选的主元素。依次扫描所给数组中的每个整数,将第一个遇到的整数 Num 保存到c中,记录 Num 的出现次数为 1:若遇到的下一个整数仍等于 Num,则计数加 ,否则计数减 1;当计数减到 0时,将遇到的下一个整数保存到c 中,计数重新记为 1,开始新一轮计数,即从当前位置开始重复上述过程,直到扫描完全部数组元素。

2.判断 c中元素是否是真正的主元素。再次扫描该数组,统计 c 中元素出现的次数,若大于n/2,则为主元素;否则,序列中不存在主元素。

让我们来看一下代码该如何实现

int majority(int a[], int n)
{int i = 0;int c = 0;//c用来保存候选主元素,count用来计数int count = 1;c = a[0];//设置a[0]为候选主元素for (i = 1; i < n; i++)//查找候选主元素{if (a[i] == c)//对a中的候选主元素计数count++;elseif (count > 0)//处理不是候选主元素的情况count--;else//更换候选主元素,重新计数{c = a[i];count = 1;}}if(count>0)//统计候选主元素的实际出现次数for (i = 0, count = 0; i < n; i++){if (a[i] == c)count++;}if (count > n / 2)//确认候选主元素return c;else//不存在主元素return -1;
}

完整测试代码

#include<stdio.h>
int a[8] = { 0,5,5,3,5,7,5,5};
int n = 8;
int majority(int a[], int n)
{int i = 0;int c = 0;//c用来保存候选主元素,count用来计数int count = 1;c = a[0];//设置a[0]为候选主元素for (i = 1; i < n; i++)//查找候选主元素{if (a[i] == c)//对a中的候选主元素计数count++;elseif (count > 0)//处理不是候选主元素的情况count--;else//更换候选主元素,重新计数{c = a[i];count = 1;}}if(count>0)//统计候选主元素的实际出现次数for (i = 0, count = 0; i < n; i++){if (a[i] == c)count++;}if (count > n / 2)//确认候选主元素return c;else//不存在主元素return -1;
}
int main()
{int ret = majority(a, n);if (ret != -1)printf("中位数为%d", ret);elseprintf("未找到");return 0;
}

用a[8]={0,5,5,3,5,1,5,7 }测试结果为

用a[8] = { 0,5,5,3,5,7,5,5}测试结果为

http://www.lryc.cn/news/221484.html

相关文章:

  • OpenTiny Vue 3.11.0 发布:增加富文本、ColorPicker等4个新组件,迎来了贡献者大爆发!
  • vivado查看报告和消息5
  • 基于javaweb+mysql的jsp+servlet学生成绩管理系统(管理员、教师、学生)
  • 基于卷积优化算法的无人机航迹规划-附代码
  • 科技云报道:不卷自研大模型,金山办公如何创新生成式AI?
  • 3BHE022291R0101 PCD230A 专注于制造卓越人工智能
  • 小程序 scroll-view 性能问题
  • 【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG
  • OverDraw的优化
  • 数据结构—字符串
  • inne所属公司抢注“童年时光”商标仍被冻结
  • 20231106-前端学习加载和视频球特效
  • Arrays.asList() 和 List.of() 的列表之争
  • 基于51单片机的停车场管理系统仿真电路设计
  • APIView单一资源的查看更新删除
  • UML--类图的表示
  • JVM字节码文件浅谈
  • DBever 连接trino时区问题 The datetime zone id ‘GMT+08:00‘ is not recognised
  • xlua源码分析(二)lua Call C#的无wrap实现
  • MySql优化经验分享
  • 【Linux】:使用git命令行 || 在github创建项目 || Linux第一个小程序——进度条(进阶版本)
  • Kotlin apply 交换两个数
  • Android jetpack : Navigation 导航 路由 、 单个Activity嵌套多个Fragment的UI架构方式
  • 【react】在react中祖父、父亲、孙子组件层层解构其余属性props时报错children.forEach is not function
  • P9831 [ICPC2020 Shanghai R] Gitignore
  • LinkList集合方法(自写)
  • Ansible playbook自动化运维工具详解
  • 图像切分:将一张长图片切分为指定长宽的多张图片
  • ROS学习笔记(5):ros_control
  • 《008.Springboot+vue之自习室选座系统》