有参加蓝桥杯的同学可以给博主点个关注,博主也在准备蓝桥杯,可以跟着博主的博客一起刷题。

蓝桥杯

我的AcWing

题目及图片来自蓝桥杯C++ AB组辅导课

归并排序

归并排序——分治

① 确定分界点:mid = (l + r) / 2

② 递归排序 left,right

③ 归并——合二为一

归并中最麻烦的就是最后一步:合二为一,我们可以利用双指针,假设我们有两个有序的序列,然后用res[]数组记录答案,两个指针分别指向序列的头部,也就是两个序列分别的最小值min,此时比较这两个指针指向值的大小,此时这两个指针较小值就是两个序列中的最小值,假设第一个序列的是两个序列的最小值,我们将这个值存入res[]中,第一个序列指针往后挪一位。

挪完之后我们发现,第一个指针还是第一个序列中最小的值,那么我们再跟第二个序列的指针比较,再把较小值存入数组中。

以此类推,两个指针依次往后走进行比较,直到其中有一个指针走到终点,循环此时可以退出,假设第二个指针走了一半,把第二个序列后半段的值直接补到数组即可。

归并排序算法是稳定的,当两个指针指向的值相同时,我们优先将第一个序列的值存入数组中。

例题

AcWing 787. 归并排序

模板题

import java.util.Scanner;public class Main {static final int N = 100010;static int[] q = new int[N];static int[] tmp = new int[N]; // 辅助存值的数组public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();for (int i = 0; i < n; i++) q[i] = sc.nextInt();merge_sort(q, 0, n - 1);for (int i = 0; i < n; i++) System.out.print(q[i] + " ");}private static void merge_sort(int q[], int l, int r) {if (l >= r) return;int mid = (l + r) / 2; // 确定分界点merge_sort(q, l, mid); // 递归对左区间和右区间排序merge_sort(q, mid + 1, r);int k = 0; // k表示当前已经合并了几个数int i = l, j = mid + 1;  // 初始化两个序列的指针while (i <= mid && j <= r) // 归并if (q[i] <= q[j]) tmp[k++] = q[i++];else tmp[k++] = q[j++];while (i <= mid) tmp[k++] = q[i++]; // 如果i还没走完 将左区间剩余的直接存入数组while (j <= r) tmp[k++] = q[j++]; // 如果j还没走完 将右区间剩余的直接存入数组for (i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];}
}

AcWing 788. 逆序对的数量

序列中任意两个数,前面的数比后面的数大,那么这两个数就是逆序对。

基于分治的思想,将所有的逆序对分成三大类:

① 两个数同时出现在左半边

② 两个数同时出现在右半边

③ 一个数在左半边 一个数在右半边

假定我们归并排序的函数可以将整个区间排好序的同时,求出来整个区间内部所有逆序对的个数

我们发现再求黄色逆序对数量时,我们可以利用归并排序来求,还是双指针,当第二个序列指针比第一个序列小时,q[i] > q[j],我们可以发现从i开始这个区间的所有数都比q[j]大,此时s[j] = mid - i + 1

因此求我们黄色逆序对的数量,每一次当我们要把q[j]输出来的时候,就在答案里加上mid - i + 1就可以了。

import java.util.Scanner;public class Main {static final int N = 100010;static int[] q = new int[N];static int[] tmp = new int[N];public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();for (int i = 0; i < n; i++) q[i] = sc.nextInt();System.out.println(merge_sort(0, n - 1));}private static long merge_sort(int l, int r) {if (l >= r) return 0;int mid = l + r >> 1;long res = merge_sort(l, mid) + merge_sort(mid + 1, r);// 归并的过程int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r)if (q[i] <= q[j]) tmp[k++] = q[i++];else {tmp[k++] = q[j++];res += mid - i + 1;}// 扫尾while (i <= mid) tmp[k++] = q[i++];while (j <= r) tmp[k++] = q[j++];// 物归原主for (i = l, j = 0; i <=r; i++, j++) q[i] = tmp[j];return res;}
}

第五届2014年蓝桥杯真题

AcWing 1215. 小朋友排队

C++B组第10题

归并排序+贪心

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {static Child[] children;static Child[] temp;public static void main(String[] args) throws IOException {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(in.readLine());children = new Child[n];temp = new Child[n];String[] num = in.readLine().split(" ");for (int i = 0; i < n; i++) {children[i] = new Child(Integer.parseInt(num[i]));}mergeSort(0, n - 1);long res = 0;for (int i = 0; i < n; i++) res += cal(children[i].k);System.out.println(res);}private static long cal(int k) {return ((long) k * (k + 1)) / 2;}private static void mergeSort(int l, int r) {if (l == r) return;int mid = l + r >> 1;mergeSort(l, mid);mergeSort(mid + 1, r);merge(l, mid, r);}private static void merge(int l, int mid, int r) {int i = l;int j = mid + 1;int k = l;while (i <= mid && j <= r) {if (children[i].h <= children[j].h){children[i].k += (j - mid - 1);temp[k++] = children[i++];} else {children[j].k += mid - i + 1;temp[k++] = children[j++];}}while (i <= mid){// 此时右边区间的所有的都是小于i所在位置的小朋友的children[i].k += r - mid;temp[k++] = children[i++];}while (j <= r) temp[k++] = children[j++];for (int m = l; m <= r ; m++) {children[m] = temp[m];}}static class Child {int h; // 小朋友的高度int k; // 该小朋友所涉及的逆序对的个数 即该小朋友需要交换的次数public Child(int h) {this.h = h;}}
}

有对代码不理解的地方可以在下方评论

蓝桥杯AcWing学习笔记 4-3排序的学习(附相关蓝桥真题:小朋友排队)(Java)相关推荐

  1. 突击蓝桥杯嵌入式(七)——第十三届省赛第一场真题

    突击蓝桥杯嵌入式(七)--第十三届省赛第一场真题 一.题目概览 二.思路梳理 我们直接在LCD例程的基础上,改需增加的外设如下: LED灯(配置锁存器PD2),串口(波特率9600,带中断),按键4个 ...

  2. 历届蓝桥杯Scratch编程省赛 初级 中级 青少年编程比赛省赛真题解析【持续更新 已更新至35题】

    历届蓝桥杯scratch省赛真题 历年蓝桥杯Scratch编程比赛省赛真题详细解析 省赛真题35-水面倒影 [蓝桥杯省赛真题35]Scratch水面倒影 少儿编程scratch编程蓝桥杯省赛真题讲解_ ...

  3. 历届蓝桥杯Scratch编程国赛 初级 中级 青少年编程比赛国赛真题解析【持续更新 已更新至27题】

    历届蓝桥杯国赛真题 第十三界.十二届.十一届等历届青少年蓝桥杯Scratch编程比赛国赛真题解析 国赛真题01-河马带球[试看] [蓝桥杯国赛真题01]Scratch河马带球 少儿编程蓝桥杯Scrat ...

  4. 分享个蓝桥杯的实训指导书,省赛国赛历年真题及解析

    刚上大一就参加了波校选,4个小时只做出了个按键翻转LCD屏的功能,确实很拉. 今年大二,校选又要开始了,于是乎开始准备,前段时间打电赛拿了个成功参赛,所以得弄弄这个蓝桥杯了.自己看了看一些赛题,感觉最 ...

  5. C++画图 => 蓝桥杯青少组C++ => 信奥 学习路线图

    一.C++画图 少儿编程:C++绘图相关书籍篇 少儿编程:C++绘图相关书籍篇_dllglvzhenfeng的博客-CSDN博客 GoC编程(C++画图)视频和资料集 GoC编程(C++画图) 视频和 ...

  6. 蓝桥杯比赛培训笔记(基于STCCT107D训练板)

    "蓝桥杯"比赛培训笔记 更新说明 第一次大更新:删除了一部分冗余的代码,将代码部分改得更为规范了些. --2020年2月23日 第二次更新:在C语言相关中增添了"数组&q ...

  7. 蓝桥杯备赛笔记-规律题

    今年大三,开始准备蓝桥杯大赛,在做了第七届以及第六届的题以后,对于蓝桥杯的考点以及考查方式有了一定的了解,这里做一个小结. 蓝桥杯的考察点每年都会考三类题型,第一种是规律题,典型特征是给出一个变化情况 ...

  8. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  9. RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)

    RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...

  10. 深度学习笔记(18) 迁移学习

    深度学习笔记(18) 迁移学习 1. 迁移学习理念 2. 图像识别的迁移学习 3. 语音识别的迁移学习 4. 使用迁移学习的场合 1. 迁移学习理念 深度学习中最强大的理念之一就是: 神经网络可以从一 ...

最新文章

  1. R语言KMeans聚类分析确定最优聚类簇数实战:间隙统计Gap Statistic(确定最优聚类簇数)
  2. 车辆行人检测数据集_开源 | 相机和激光雷达融合的行人车辆检测跟踪
  3. Selenium实例2-截图爬取漫画
  4. linux 命令读db文件格式,使用linux的db_load命令生成db数据库
  5. Devoxx Hackergarten的企业Web应用程序原型
  6. java怎样下载maven资源库_下载Maven资源库文件
  7. 金山网盾3.5实战流氓软件
  8. python基于scipy模块实现统计学中三大相关系数的计算
  9. java swing企业人事管理系统 java swing mysql实现的企业人事管理系统源码和导入文档(1013)
  10. java实现手机扫描二维码下载功能
  11. java随机生成随机整数_java生成随机整数
  12. CF1060F Shrinking Tree(期望、树形dp)
  13. 风险偏好提振,非美延续反弹
  14. js随机飘动的广告图片代码demo效果示例(整理)
  15. SAP 物料标准价和移动平均价详解
  16. 手动搭建一个https服务器,并颁发证书
  17. 微信转发后链接中不显示缩略图
  18. Fanuc发那科数据采集
  19. 社会主义市场体系与宏观调控
  20. 全球经济放水之下,数字货币牛市夭折?

热门文章

  1. Java设计模式原则
  2. 华大HC32外设驱动开发汇总
  3. 人生心灵深处的感悟收集
  4. 2022 re:Invent 凌云驭势 重塑未来
  5. excelVBA 控件WebBrowser【入门图解】在excel中展示动态网页,或静态图片 (未完成)
  6. ubuntu-16.04 详细安装教程(图文)附下载地址
  7. Scala 遍历 map
  8. python写透视挂_python环境opencv实现透视变化的方法
  9. Java 的几种版本
  10. Android模仿微信录制小视频