PTA 统计工龄 思路分析及代码解析
PTA 统计工龄 思路分析及代码解析v0.6
- 一、前导
- 1. 需要掌握的知识
- 2. 题目信息
- 二、解题思路分析
- 1. 题意理解
- 1. 1 输入数据
- 1.2 输出数据
- 2. 思路分析
- 三、具体实现
- 1. 弯路和bug
- 2. 代码框架(重点)
- 2.1 采用的数据结构
- 2.2 程序主体框架
- 2.3 各分支函数
- 3. 完整AC编码
- 四、参考
一、前导
1. 需要掌握的知识
需要熟悉各种排序算法 或者 直接使用sort()函数。本文使用快速排序完成排序
2. 题目信息
2.1 题目来源:PTA / 拼题A
2.2 题目地址: 统计工龄
二、解题思路分析
1. 题意理解
排序算法基础练习题
1. 1 输入数据
8 //员工人数
10 2 0 5 7 2 5 2 //每个员工的工龄
1.2 输出数据
0:1 //员工工龄:对应的人数
2:3
5:2
......
2. 思路分析
通过数组存储每个员工的工龄,然后使用快速排序对员工工龄进行排序,最后按要求输出即可
三、具体实现
1. 弯路和bug
快速排序实现难度比较大,容易出错。还是sort()省心省力鸭
2. 代码框架(重点)
2.1 采用的数据结构
使用数组存储员工工龄数据
typedef int ElementType;
#define max 100010
ElementType A[max];
2.2 程序主体框架
程序伪码描述
int main()
{1.存储工龄数据 2.排序3.按要求打印
}
2.3 各分支函数
2.3.1 QuickSort() 提供统一调用接口,本质是调用Qsort()函数
void QuickSort(ElementType A[], int N)
{Qsort(A, 0, N - 1);
}
2.3.2 Qsort() 核心函数,AC的关键。快速排序的步骤如下:
(1)选择基准:示例中用的是从数组的头、中、尾中选取中间值作为基准(三数取中)
ElementType MedianThree(ElementType A[], int Left, int Right) //3数取中
{int Center = (Left + Right) / 2;if (A[Left] > A[Center])Swap(&A[Left], &A[Center]); //&A[Left]表示数组元素A[Left]的地址if (A[Left] > A[Right])Swap(&A[Left], &A[Right]);if (A[Center] > A[Right])Swap(&A[Center], &A[Right]);//经过上面的位置交换后,A[Left] < A[Center] < A[Right]Swap(&A[Center], &A[Right-1]); /* 将基准Pivot放到右边,这样只需关心 Left+1 到 Right-2的数据了*/return A[Right - 1]; /* 返回基准Pivot */
}
(2)从小到大排序,比基准小的移到基准左边,大的移到右边,重复上述操作,直到Low > High,即:此时达成了这样的效果,标志位Low前的数值都比基准小,位置Low及之后的数值比基准大。将标准为Low的元素与基准交换位置,这个位置就是基准元素的最终排序位置。这样说有点难以理解,请参考下面的画图和代码(示例中,5是第一次快速排序的基准)
Pivot = MedianThree(A, Left, Right); /* Pivot就是选定的基准 */ Low = Left;High = Right - 1;while (1) /*将序列中比基准小的移到基准左边,大的移到右边*/{while (A[++Low] < Pivot) {}while (A[--High] > Pivot) {}if (Low < High) //Low=High时的情况? 想象下 2 2 2 2的快排过程 Swap(&A[Low], &A[High]);else break;}Swap(&A[Low], &A[Right - 1]); //交换之后,就找到了基准的最终排序位置了
(3)通过递归分别解决基准的左边 和 右边,由于用到了递归,当元素数量不多时,直接使用简单排序进行处理(比如快速排序)
void Qsort(ElementType A[], int Left, int Right)
{ int Pivot, Low, High;if (Right - Left >= 100) //待排序数据不小于100时,使用快速排序{找到基准最终位置的代码见(2) //找到基准的最终位置后(Low就是最终位置),通过递归进行处理Qsort(A, Left, Low - 1); /* 递归解决左边 */Qsort(A, Low + 1, Right); /* 递归解决右边 */}else Insert_Sort(A + Left, Right - Left + 1); /* 为提高效率,元素小于100时用插入排序 */
}
2.3.3 PrintResult() 按要求进行打印
void PrintResult(ElementType A[], int n)
{int count = 1;for (int i = 0; i < n; ){while (i <= n - 2 && A[i] == A[i + 1]){count++;i++;}cout << A[i] << ":" << count << endl;i++; count = 1;}
}
3. 完整AC编码
如有建议或问题,欢迎留言
#include <iostream>
#include <algorithm>
using namespace std;typedef int ElementType;
#define max 100010
#define Cutoff 100void Insert_Sort(ElementType A[], int n);ElementType MedianThree(ElementType A[], int Left, int Right);
void Swap(ElementType* a, ElementType* b);
void Quick_Sort(ElementType A[], int N);
void Qsort(ElementType A[], int Left, int Right);void PrintResult(ElementType A[], int n);int main()
{int n; ElementType A[max];cin >> n;for (int i = 0; i < n; i++)cin >> A[i];Quick_Sort(A, n);PrintResult(A, n);}
void PrintResult(ElementType A[], int n)
{int count = 1;for (int i = 0; i < n; ){while (i <= n - 2 && A[i] == A[i + 1]){count++;i++;}cout << A[i] << ":" << count << endl;i++; count = 1;}
}void Insert_Sort(ElementType A[], int n) // The similar as arrange the playing card
{int P, i, tmp;for (P = 1; P < n; P++){tmp = A[P]; //draw a cardfor (i = P; i > 0 && A[i - 1] > tmp; i--)A[i] = A[i - 1]; //move the sorted card and find the position A[i] = tmp; //insert the position}return;
}ElementType MedianThree(ElementType A[], int Left, int Right) //3数取中
{int Center = (Left + Right) / 2;if (A[Left] > A[Center])Swap(&A[Left], &A[Center]); //&A[Left]表示数组元素A[Left]的地址if (A[Left] > A[Right])Swap(&A[Left], &A[Right]);if (A[Center] > A[Right])Swap(&A[Center], &A[Right]);Swap(&A[Center], &A[Right-1]); /* 将基准Pivot藏到右边,这样只需关心 Left+1 至 Right-2的数据了*/return A[Right - 1]; /* 返回基准Pivot */
}void Qsort(ElementType A[], int Left, int Right)
{ int Pivot, Low, High;if (Right - Left >= Cutoff) //待排序数据不小于100时,使用快速排序{Pivot = MedianThree(A, Left, Right); /* 选基准 */ Low = Left;High = Right - 1;while (1) /*将序列中比基准小的移到基准左边,大的移到右边*/{while (A[++Low] < Pivot) {}while (A[--High] > Pivot) {}if (Low < High) //Low=High时的情况? Swap(&A[Low], &A[High]);else break;}Swap(&A[Low], &A[Right - 1]); /* 将基准换到正确的位置 */Qsort(A, Left, Low - 1); /* 递归解决左边 */Qsort(A, Low + 1, Right); /* 递归解决右边 */}else Insert_Sort(A + Left, Right - Left + 1); /* 为提高效率,元素小于100时用插入排序 */
}void Quick_Sort(ElementType A[], int N)
{ Qsort(A, 0, N - 1);
}void Swap(ElementType* a, ElementType* b) //直接交换
{int tmp=*a; *a = *b; *b = tmp;
}
四、参考
浙江大学 陈越、何钦铭老师主讲的数据结构
PTA 统计工龄 思路分析及代码解析相关推荐
- PTA 旅游规划(邻接矩阵) 思路分析及代码解析
PTA 旅游规划 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) 三.具体实 ...
- PTA 电话聊天狂人 思路分析及代码解析
PTA 电话聊天狂人 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 ...
- PTA 旅游规划(邻接表) 思路分析及代码解析
PTA 旅游规划_使用邻接表 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...
- PTA 树的同构 思路分析及代码解析
PTA 树的同构 思路分析及代码解析 v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 2. 思路分析(重点) 三.具体实现 1. 弯路和bug 2. 代码框 ...
- PTA 哈利·波特的考试 思路分析及代码解析
PTA 哈利·波特的考试 思路分析及代码解析v0.9.1 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...
- PTA QQ帐户的申请与登陆 思路分析及代码解析
PTA QQ帐户的申请与登陆 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具 ...
- PTA 公路村村通 思路分析及代码解析
PTA 公路村村通 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) 三.具体实现 1. 弯路和bug 2 ...
- 基于单层决策树的adaBoost算法思想分析和源代码解析
基于单层决策树的AdaBoost算法思想分析和源代码解析 前言: 上一篇SVM可是废了我好鼻子劲,这一篇咱们来点愉快的东西.我们一定听说过这句俗语:"三个臭皮匠,顶个诸葛亮!" 大 ...
- 2022华数杯B题论文思路分析+完整代码(水下机器人组装计划)(一二问答案接出来和标准答案一样)(问题三四逼近正确答案)(完整论文,代码可直接跑)
写在前面:学校最近搞数学建模竞赛培训,以2022华数杯B题作为训练题目,在查资料过程中发现网上没有哪一篇论文解出了正确答案,而我们组利用Lingo软件准确的解出了正确答案,但是在第三问时,由于决策的变 ...
最新文章
- python三层装饰器-python3装饰器
- linux getopts学习笔记
- html表单action属性值,HTML中的form表单中的action属性
- DotNetCore中异步编程的实用演练
- 什么是GaussDB
- 苹果macmac效率工具:Alfred
- [Swift]LeetCode664. 奇怪的打印机 | Strange Printer
- eclipse ADT完整环境下载
- qt linux 网络聊天室,QT tcp网络聊天室群聊的实现
- Windows 10 下,强制关闭端口
- 深度分析何恺明新作MAE:通向CV大模型
- android popWindow组件微信式实现(较完整版)
- Kong 网关 | Rate Limiting 限流
- 10号前发工资和15号后发工资有啥区别
- 多重积分的理解以及转动惯量的求解
- 【步兵 cocos2dx】热更新(下)
- adb发送什么命令能在手机屏幕弹窗显示_Android 手机投屏在 Ubuntu 上的方法
- 欧洲哲学发展趋势与中国哲学的机遇
- 2022化工自动化控制仪表操作证考试题库及答案
- lstm预测单词_下一个单词预测完整指南
热门文章
- Android7.0 Notification Show silently 阻止通知 定制
- 直播系统---从数据层设计的角度看映客直播系统架构变化
- 知乎高赞回答:为什么高级程序员不必担心自己的技术过时?
- Java 中 Integer 源码学习之缓存池了解
- 2023年某科技公司前端开发初级岗的面试笔试真题(含选择题答案、问答题解析、机试题源码)
- 链表c语言代码题库排坐标,C语言讲义——链表完整代码
- 一文搞懂Grid 布局
- 09 模型的增删查改《ThinkPHP6 入门到电商实战》
- 2020-11-25T09:10:13.000Z mysql 自动生成的时间格式化 vue
- 微博html5版登录,新浪微博模拟登录 支持手动处理验证码