原题:

输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出。

任务1,分数为不超过100的非负整数。(题眼。)

任务2,分数为不超过100.00的非负实数。保留两位小数(两位的处理)

依照惯例,先看看我的垃圾代码。

#include <stdio.h>
#include <string.h>
#include <math.h>
int b[100];
double a[100],c[100];
int main()
{   int i =0,flag,j,al,max=0,k=0,cl;double t;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c,0,sizeof(c));while(scanf("%lf",&t)==1){ flag=0;for(j=0;j<i;j++){if(fabs(a[j]-t)<=0.000000001){  b[j]++; flag =1; if(b[j]>max){max=b[j];memset(c,0,sizeof(c));k=0;c[k++]=a[j];}else if(b[j]==max){c[k++]=a[j];}break;} }if(!flag){a[i]=t;b[i]=1;i++;}}al=i;//利用i来记录a的长度 不同数字的个数cl=k;//c的长度 最多出现的数字的个数//给c选择排序 for(i=0;i<cl;i++){for(j=i;j<cl;j++){if(c[i]>c[j]){t=c[j];c[j]=c[i];c[i]=t;}}}printf("%d\n",al);for(i=0;i<al;i++)printf("%.2lf ",a[i]);printf("\n");for(i=0;i<al;i++)printf("%d ",b[i]);printf("\n");for(i=0;i<cl;i++)printf("%.2lf ",c[i]);printf("\n");}  

此处为任务2的代码,任务1直接将a,c换成int型数组即可。

此方法很弱智地绕弯型思维,竟然用了三个数组完成这件事,而且数组长度明显存在隐患。因为方法错误而产生了各种较为难以解决的问题。

此方法的思维模式是:

1.如何将输入的数字存起来,并且记录其出现的次数。

2.如何找到出现最多次的数字,并存起来。(此处需要动态重置数组)

3.如何排序

于是为了解决这三个问题,花费了非常复杂的代码。虽然见佛当佛见鬼杀鬼,但是在性能上明显输了。而且有缺点。

1.数组长度漏洞

2.doule型比较存在隐患

此时,再看看什么叫算法艺术。

        int max=0,n=0,a[100]={0},x;while(cin >> x){if(++a[x]>max) max=a[x];if(x>n) n=x;//此处记录最大的分数,用来缩小循环次数}for(int i=0;i<=n;i++) if(a[i]==max) cout << i << " ";

多么简洁,多么完美,多么像一个清新可人的少女阿我去。。。

启发

1.数组下标本身就是一个有序数组,因为0~100,正好是题目中要求的范围,

此举(1) 解决了一个记录输入数据的数组,节省空间。(2)解决了排序的问题,直接按序输出,即可。

2.此代码简洁异常。比如++的利用,比如a[100]={0}的利用,不过这个貌似是才c++的特殊用法。c里是memset()

3.这才是直接型的思维。 你本来要输入未知个数个数据,但是这个数据的范围是有限的,而且你还要在这些数据上做文章。

那么用数组下标来表示数据,用数组内容来表示个数,极其合适。顺便解决了排序的问题

4.扩展性好,比如看任务2的代码。

        int max=0,n=-1,a[10010]={0}; //is hash?double x;while(cin >> x){if(++a[(int)floor(x*100)]>max) max=a[(int)floor(x*100+0.5)];// +0.5防止浮点数陷阱if((int)floor(x*100)>n) n=(int)floor(x*100);//用来缩小循环次数} for(int i=0;i<=n;i++) if(a[i]==max)printf("%.2lf ",(double)i/100);//cout << setiosflags(ios::fixed) << setprecision(2) << (double)i/100 << " ";

接4. 因为要解决有关二位小数的问题,但是数组下标只能是整数。所以不妨用10000来表示100.00 用2233来表示22.33

简直完美。

今天才知道这个叫做桶排序

今天拿冒泡排序的代码去试wikioi的排序题。。。超时太严重了

在题解中了解到了,归并排序,,快速排序,希尔排序,等等还有c++的stl中的sort,貌似也不超时。

选择排序,是一种不稳定的排序,冒泡排序是一种稳定排序。。。我之前一直弄混了。

转载于:https://www.cnblogs.com/yuchenlin/p/4379271.html

【算法学习笔记】03.白书练习题stat(排序入门:冒泡,桶)相关推荐

  1. 极客算法训练笔记(六),十大经典排序之希尔排序,快速排序

    目录 抛砖引玉 希尔排序 快速排序 抛砖引玉 十大经典排序算法江山图 十大经典排序算法江山图 排序算法的衡量指标我这里不再重复,上一篇我已经列举分析的很清楚了,但是非常重要,没看到我上一篇的小伙伴墙裂 ...

  2. 白鲸优化算法学习笔记

    白鲸优化算法学习笔记 1. 引言 白鲸优化算法(Whale Optimization Algorithm,简称WOA)是一种基于自然界中的白鲸行为而发展起来的启发式优化算法.该算法模拟了白鲸群体的寻食 ...

  3. openCVPracticalExercise学习笔记03

    原创:openCVPracticalExercise学习笔记03 20使用OpenCV实现基于增强相关系数最大化的图像对齐(略) 21使用OpenCV的Eigenface 如何计算如何计算EigenF ...

  4. 数据结构与算法学习笔记——链栈

    数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...

  5. python半径为3圆形区域边界曲线_OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓...

    本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl 使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg 代码如下: impor ...

  6. 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配

    数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...

  7. 冰冰学习笔记:这些链表练习题,你会吗?(中)

    欢迎各位大佬光临本文章!!!   还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点 ...

  8. 天池龙珠训练营-机器学习学习笔记-03 LightGBM 分类

    天池龙珠训练营-机器学习学习笔记-03 LightGBM 分类 本学习笔记为阿里云天池龙珠计划机器学习训练营的学习内容,学习链接为:训练营 一 原理简介: 它是一款基于GBDT(梯度提升决策树)算法的 ...

  9. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

最新文章

  1. 享元模式 Flyweight Pattern
  2. 科普丨人工智能发展的S曲线
  3. opencv python BRIEF描述子
  4. python中set怎么循环_python如何遍历set
  5. NAVICAT连接oracle数据库的时候出现ora-01033
  6. Jquery实现 全选反选
  7. 在linux通过源码编译安装redis详细步骤
  8. 【ACM】括号配对问题 - 栈
  9. 那些聪明人都是怎么提高情商的?
  10. 编写 USB 存储设备使用痕迹检测和删除工具
  11. 服务器大线程有什么作用,全面剖析超线程技术优点与缺点
  12. 华为Mate40Pro和华为Mate40Pro+ 哪个好
  13. 社团管理——原型设计
  14. 学习Docker之Docker初体验 简单用例---SpringBoot集成Docker的部署、发布与应用
  15. CSDN Serverless峰会,带你走进云的下一个十年
  16. define不是c语言语句,define是语句
  17. STM32F103代码远程升级(五)基于MQTT协议WiFi远程升级代码的实现
  18. 加药装置 全自动加药装置 示踪加药装置介绍
  19. 你的变量究竟存储在什么地方 全局内存
  20. 【ra3mod】3dsmax9 安装的各类问题

热门文章

  1. Linux 如何将eth1网卡修改为eth0
  2. Base64编码对照表
  3. Linux之ssh-copy-id命令
  4. java8 elasticsearch_java – Elasticsearch – Junit测试(模拟或填...
  5. 大数据工程师职场面试攻略技巧有哪些?
  6. 1.3—Spring基础配置—3.AOP
  7. 乔布斯《我生命中的三个故事》
  8. 监控 MySQL的多种方法
  9. linux添加自定义的命令!
  10. Intermapper系列网络管理工具中文版教程