题目

众数指在一组数据中出现次数最多的数,例如若数据集合是{1,2,9,5,9,6,9},则其众数是9;若数据集合是{1,8,9,5,9,8,6,8,9},由于8和9都出现了3次,则其众数是8和9。请设计一个有效的算法,在10万个顺序存储的数据元素集合(无序存储)中找出众数,并分析所设计算法的时间复杂度。

代码来源

算法思路参考了博客
https://blog.csdn.net/liujian20150808/article/details/50637554
在此感谢作者

广告

若有同学需要桂林电子科技大学数据结构考研真题和答案解析(个人制作)或指定参考书《算法与数据结构》第三版张乃孝PDF等资料的欢迎交流(QQ((肆+壹)幺幺)&微信(月球不太圆)15577498906)

算法思路

通过快速排序对数据集合进行排序,然后遍历数据集合,将数据集合中的每个数据的个数记录下来。然后通过记录的数据找到数据中出现次数最多的数。将出现次数最多的数存入链表中,返回。
答案:算法的时间复杂度为O(nlog2n)。
通过快速排序对数据集合进行排序,快速排序的时间复杂度为O(nlog2n)。然后遍历数据集合,将数据集合中的每个数据的个数记录下来,数据只被遍历一次,时间复杂度为O(n)。然后通过记录的数据找到数据中出现次数最多的数,数据只被遍历一次,时间复杂度为O(n)。最后将出现次数最多的数存入链表中,返回,数据只被遍历一次,时间复杂度为O(n)。总体的时间复杂度为O(nlog2n)+O(3n)。

代码

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//找众数
#define MAXNUM 1000000
typedef int DataType;
struct SeqList{int MAX_NUM=MAXNUM;int n;      //n是当前取105DataType *element;
};
struct node
{int value;int length;struct node * next;
};
struct List
{DataType element;struct List * next;
};
int Partition(int a[], int low, int high)
{int key = a[low];while(low<high){while(low<high && a[high] >= key) --high;a[low] = a[high];while(low<high && a[low] <= key) ++low;a[high] = a[low];}a[low] = key;for(int i=0;i<8;i++)cout<<a[i]<<" ";cout<<endl;return low;
}
void Qsort(int a[], int low, int high)
{int i;if(low < high){int loc = Partition(a, low, high);Qsort(a, low, loc-1);Qsort(a, loc+1, high);}
}struct List * findMode(SeqList *sList)
{/*通过快速排序将数组进行排序,这是为了减少重复遍历的次数,我们可以先将数组升序排序,然后只需遍历一遍数组,就可以记录每个数字出现的次数 */Qsort(sList->element,0,sList->n-1); int i,flag,temp=0;/*建立带头结点链表nodelist,储存数据集合中的每个数据的个数*/struct node * nodelist;struct node * s;//建立头结点 nodelist=(struct node *)malloc(sizeof(struct node));nodelist->next=NULL;/*记录每个数据的个数,具体方法是通过不断变化记录的标志flag而更新结构体数组的值*/flag=sList->element[0];for(i=0;i<sList->n;i++){/*当flag不等于sList->element[i]时,说明数据发生了变化。这时可以记录下sList->element[i-1]的个数 */if(sList->element[i]!=flag){flag = sList->element[i];s=(struct node *)malloc(sizeof(struct node));s->value=sList->element[i-1];s->length=i-temp;s->next=nodelist->next;nodelist->next=s;temp = i;flag=sList->element[i];}}/*这里需要注意的一个问题是,由于遍历到最后一个数无法再进行if判断便跳出循环,所以我们无法记录最后一个数字或者说是最后出现的数字的次数,所以在循环体外还要记录一下最后出现的数字的次数。*/s=(struct node *)malloc(sizeof(struct node));s->value=sList->element[i-1];s->length=i-temp;s->next=nodelist->next;/*通过记录的数据找到数据中s->length的最大值,即出现次数最高的数出现了多少次 */ nodelist->next=s;int max=0; while(s!=NULL){if(s->length>max){max=s->length;          }s=s->next;}s=nodelist->next;/*找到出现次数最多的数,并用带头结点的链表modelist储存,最后将找到的结果返回 */struct List * modelist;struct List * mode;modelist=(struct List *)malloc(sizeof(struct List));modelist->next=NULL;while(s!=NULL){if(s->length==max){mode=(struct List *)malloc(sizeof(struct List));mode->element=s->value;mode->next=modelist->next;modelist->next=mode;}s=s->next;}return modelist->next;
}
int main(int argc, char** argv) {struct SeqList * sList;sList=(struct SeqList *)malloc(sizeof(struct SeqList));sList->n=9;sList->element=(DataType *)malloc(sizeof(int)*sList->n);int a[9]={1,8,9,5,9,8,6,8,9};for(int i=0;i<sList->n;i++){sList->element[i]=a[i];}struct List * modelist=findMode(sList);while(modelist!=NULL){cout<<modelist->element<<" ";modelist=modelist->next;}return 0;
}

运行结果

除了最后一行其他的都是快排的中间过程,最后一行是输出的是数组中的众数。

2018-910-六相关推荐

  1. 第六届全国计算机学科博士后论坛,大会 | 「2018 第六届全国计算机学科博士后论坛」今天召开,鹏城实验室博士后工作站挂牌...

    黄正能教授讲道,现在生活中有大量的摄像头.海量的视觉数据,深度学习的发展也带来了分类识别.检测追踪.语义分割.人体姿态识别等等技术成果,在交通.渔业都有诸多应用.那么未来还能做什么?我们目前的检测.分 ...

  2. 【百强榜单】2018第六届上汽设计国际挑战赛 全球百强作品正式公布!

    近日,2018年第六届上汽设计国际挑战赛(SDC)百强评审会,在上汽设计中国总部设计中心.上汽欧洲前瞻设计中心两地同时展开. 作为中国最具影响力的国际汽车设计挑战赛,上汽设计国际挑战赛获得了海内外高校 ...

  3. WIN7封装教程2018系列(六)—封装

    第六系列是整个教程的重点,步骤必须细致谨慎考虑周全,尽量不要出错,我也反复封装了两三次才成功,并不是你们在教程里看到的一次就成功.我直接把正确封装步骤的截图,按顺序编辑好了,照着我的教程做就行了.封装 ...

  4. 尔雅 科学通史(吴国盛) 个人笔记及课后习题 2018 第六章 自然的数学化和分析化

    科学通史 第六章 自然的数学化和分析化 6.1自然的数学化和分析化 希腊背景和基督教背景是欧洲科技革命必不可缺的背景 欧洲数理传统学科 哥白尼革命 6.1自然的数学化和分析化(习题) 6.2天文学的发 ...

  5. 小学六年级能用计算机器,2018小学六年级信息技术试题.doc

    小学六年级信息技术试题 一.填空题(每空2分,共20分)?? 1.计算机存储器的计量单位字节用____表示,千字节用___表示,兆字节用____表示,?吉字节用?___表示,太字节用?___表示.? ...

  6. 软件工程实践2018第六次作业——现场UML作图

    团队信息 学号 姓名 博客链接 124 王彬(组长) 点击这里 206 赵畅 点击这里 215 胡展瑞 点击这里 320 李恒达 点击这里 131 佘岳昕 点击这里 431 王源 点击这里 206 陈 ...

  7. 2018 年值得关注的 Web 设计趋势

    英文原文:Web Design Trends To Watch Out For In 2018 原文地址:https://usersnap.com/blog/web-design-trends-201 ...

  8. 天猫高管全面解读大快消2018新零售打法

    "两个礼拜增长了80万粉丝.过去4年我们累计了41万粉丝,现在用新零售的一个策略,两个礼拜干出了4年的两倍."林清轩创始人孙春来说:"天猫旗舰店是一个流量低成本获取入口. ...

  9. 特岗多少分入围_环球游戏开发挑战赛决赛入围者:查看六个获奖作品!

    特岗多少分入围 The Universal GameDev Challenge tasked Unity developers to design a game for one of Universa ...

  10. 可视化-echarts流向图制作及recharts

    前段时间用echarts做了流程图,在此记录下制作步骤. 一.Echarts是什么 Echarts,缩写来自 Enterprise Charts,商业级数据图表,是百度的一个开源的数据可视化工具,一个 ...

最新文章

  1. [51nod1384]全排列
  2. 【2018年更新】Sublime text 3安装教程(Windows版本)
  3. rehat linux设置ip,RedhatHat配置IPv6地址
  4. 对称加密实现重要日志上报Openresty接口服务
  5. python flask框架是什么_Flask框架是什么?带你安装运行第一个Flask程序
  6. 灵格斯怎么屏幕取词_电脑包尺寸怎么选?手提的好还是双肩的好?比较推荐哪款电脑包?...
  7. 通过计算机网络进行的商务活动包括,电子商务练习题及答案
  8. cad统计多条线段总长度插件_超级实用CAD技巧应用汇总!技巧大全、插件合集、快捷键合集等...
  9. 简单在于的acdsee 2012
  10. pg库使用dblink连接mysql_PG-跨库操作-dblink
  11. python倒三角代码_vb代码输出倒三角形 python倒三角代码
  12. RadomStuDemo
  13. JAVA BufferedWriter的newLine方法
  14. ​为什么用Go编写机器学习的基础架构,而不是Python?
  15. H5如何拉起微信扫一扫
  16. ML:MLOps系列讲解之系列知识解读之完整总结系列内容(第一章~第九章)
  17. python名片管理系统难点总结_Python 知识要点:名片管理系统 2.0
  18. matlab中subplot函数用法
  19. “功能”之后,网约车决胜“服务”
  20. 嵌入式linux开发,openssl-0.9.8d移植

热门文章

  1. carsim输入模块设置问题
  2. bat文件打开cmd指向某个目录,并执行命令
  3. 生物质的特性对其与煤共气化过程的影响
  4. 为什么百度语音比科大讯飞差了几条街?
  5. c语言程序设计服装销售系统报告,服装销售管理系统—C语言课程设计
  6. NOI / 1.2编程基础之变量定义、赋值及转换
  7. linux环境下编译部署php生产环境
  8. William Wingate从事比萨饼分析服务。对于每个披萨饼,他都需要记录下列信息:
  9. SEO魔法书-网站优化
  10. 谈谈对“周日焦虑症”的看法