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

蓝桥杯

我的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. PyTorch 自动微分
  2. 敏捷估算和计划的12条知道原则
  3. python画图程序-python画图之“小海龟”turtle
  4. [译] 你是如何拆分组件的?
  5. IT行业经典面试题,121套面试题
  6. PHP foreach 小结
  7. [Leedcode][JAVA][第128题][最长连续序列][Hash]
  8. Err:error occurred at recursive SQL level 1
  9. POJ NOI MATH-7647 余数相同问题
  10. Java中static的用法,初始化块
  11. 基于java+SpringBoot+HTML+Mysql)疫情防控微信小程序
  12. Unable to load library 'xxx': Native library (linux-x86-64/xxx.so) not found in resourc 问题解决
  13. 卸载精灵 v4.2 是什么
  14. 阿里国际站各数据更新时间汇总
  15. win10进不了BIOS界面
  16. GEEM2引擎微端架设基本教程
  17. 2020年12月-第02阶段-前端基础-CSS Day07
  18. 通话记录有办法恢复吗?
  19. 4PS-4CS--4RS
  20. [TCP]基于TCP的心跳和加密设计

热门文章

  1. 千元机市场风潮再起,一张“诚意牌”折射出的两种可能
  2. java正则表达式 替换空格_Java正则表达式替换移除空行和多余的空格
  3. 让AutoCAD启动时自动加载应用程序
  4. scanf和getchar缓冲区中问题的解疑
  5. Photoshop下载附免费资源
  6. java.math.BigDecimal类multiply的使用
  7. VIM快速移动光标到行首行尾及特定行
  8. WellYa VoIP NGN IMS 3G GSM CDMA 通信资料下载集合 (希望置顶)
  9. TextArea换行数据回显页面不换行问题
  10. java ignorecase_Java String compareToIgnoreCase() 使用方法及示例