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 统计工龄 思路分析及代码解析相关推荐

  1. PTA 旅游规划(邻接矩阵) 思路分析及代码解析

    PTA 旅游规划 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) 三.具体实 ...

  2. PTA 电话聊天狂人 思路分析及代码解析

    PTA 电话聊天狂人 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具体实现 ...

  3. PTA 旅游规划(邻接表) 思路分析及代码解析

    PTA 旅游规划_使用邻接表 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...

  4. PTA 树的同构 思路分析及代码解析

    PTA 树的同构 思路分析及代码解析 v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 2. 思路分析(重点) 三.具体实现 1. 弯路和bug 2. 代码框 ...

  5. PTA 哈利·波特的考试 思路分析及代码解析

    PTA 哈利·波特的考试 思路分析及代码解析v0.9.1 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) ...

  6. PTA QQ帐户的申请与登陆 思路分析及代码解析

    PTA QQ帐户的申请与登陆 思路分析及代码解析v1.0 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析 三.具 ...

  7. PTA 公路村村通 思路分析及代码解析

    PTA 公路村村通 一.前导 1. 需要掌握的知识 2. 题目信息 二.解题思路分析 1. 题意理解 1. 1 输入数据 1.2 输出数据 2. 思路分析(重点) 三.具体实现 1. 弯路和bug 2 ...

  8. 基于单层决策树的adaBoost算法思想分析和源代码解析

    基于单层决策树的AdaBoost算法思想分析和源代码解析 前言: 上一篇SVM可是废了我好鼻子劲,这一篇咱们来点愉快的东西.我们一定听说过这句俗语:"三个臭皮匠,顶个诸葛亮!" 大 ...

  9. 2022华数杯B题论文思路分析+完整代码(水下机器人组装计划)(一二问答案接出来和标准答案一样)(问题三四逼近正确答案)(完整论文,代码可直接跑)

    写在前面:学校最近搞数学建模竞赛培训,以2022华数杯B题作为训练题目,在查资料过程中发现网上没有哪一篇论文解出了正确答案,而我们组利用Lingo软件准确的解出了正确答案,但是在第三问时,由于决策的变 ...

最新文章

  1. python三层装饰器-python3装饰器
  2. linux getopts学习笔记
  3. html表单action属性值,HTML中的form表单中的action属性
  4. DotNetCore中异步编程的实用演练
  5. 什么是GaussDB
  6. 苹果macmac效率工具:Alfred
  7. [Swift]LeetCode664. 奇怪的打印机 | Strange Printer
  8. eclipse ADT完整环境下载
  9. qt linux 网络聊天室,QT tcp网络聊天室群聊的实现
  10. Windows 10 下,强制关闭端口
  11. 深度分析何恺明新作MAE:通向CV大模型
  12. android popWindow组件微信式实现(较完整版)
  13. Kong 网关 | Rate Limiting 限流
  14. 10号前发工资和15号后发工资有啥区别
  15. 多重积分的理解以及转动惯量的求解
  16. 【步兵 cocos2dx】热更新(下)
  17. adb发送什么命令能在手机屏幕弹窗显示_Android 手机投屏在 Ubuntu 上的方法
  18. 欧洲哲学发展趋势与中国哲学的机遇
  19. 2022化工自动化控制仪表操作证考试题库及答案
  20. lstm预测单词_下一个单词预测完整指南

热门文章

  1. Android7.0 Notification Show silently 阻止通知 定制
  2. 直播系统---从数据层设计的角度看映客直播系统架构变化
  3. 知乎高赞回答:为什么高级程序员不必担心自己的技术过时?
  4. Java 中 Integer 源码学习之缓存池了解
  5. 2023年某科技公司前端开发初级岗的面试笔试真题(含选择题答案、问答题解析、机试题源码)
  6. 链表c语言代码题库排坐标,C语言讲义——链表完整代码
  7. 一文搞懂Grid 布局
  8. 09 模型的增删查改《ThinkPHP6 入门到电商实战》
  9. 2020-11-25T09:10:13.000Z mysql 自动生成的时间格式化 vue
  10. 微博html5版登录,新浪微博模拟登录 支持手动处理验证码