归并排序的扩展问题

——先了解数据结构之归并排序,更容易理解以下的问题。

  • 小和问题和逆序对问题。
    在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对。(据说,小和问题面试必考)
  1. 小和问题可以反向思维,从左往右找比这个数大的数有几个。

  2. 用归并的方法。

  3. 逆序对问题与小和问题时相同的。只需要将相加改成打印逆序对。

    例如,该数组为 a[6]={1,3,4,2,5,4};

    如下给出完整的计算小和的示意过程:

    (1)在(1~1)范围上比较

    (2)在(2~2)范围上比较

    (3)在(4~4)范围上比较

    (4)在(5~5)范围上比较

    (5)在(3~5)范围上比较

    将所有荧光笔标记的数值相加即最终的答案。

如下是计算小和的完整代码:(与归并排序只有两行不同)

#include <iostream>int merge(int a[], int l, int m, int r)
{int *help = new int[6];int i = 0;int p1 = l;int p2 = m + 1;int res = 0;while (p1 <= m && p2 <= r){//小和问题的条件 左边的数小于右边的数res += a[p1] < a[p2] ? (a[p1] * (r - p2 + 1)) : 0;//当左边严格小于右边时,才将左边的数字拷贝到help[]//不能是小于等于,因为这样才不会少统计   help[i++] = a[p1] < a[p2] ? a[p1++] : a[p2++];}while (p1 <= m){help[i++] = a[p1++];}while (p2 <= r){help[i++] = a[p2++];}for (int j = 0; j < i; j++){a[l + j] = help[j];}return res;
}int MergeSort(int  a[], int l, int r)
{if (l < r) {int mid = l + ((r - l) >> 1);//左侧范围上排序求小和return MergeSort(a, l, mid)//右侧范围上求小和+MergeSort(a, mid + 1, r)//左组和右组合并的情况下求小和+merge(a, l, mid, r);}    return 0;
}int main()
{int a[] = { 1,3,4,2,5,4 };int i = 0, n = 6;int ans = MergeSort(a, i, n-1);std::cout << ans;
}

下面是逆序对问题的完整代码:

#include <iostream>void merge(int a[], int l, int m, int r)
{int *help = new int[6];int i = 0;int p1 = l;int p2 = m + 1;int res = 0;while (p1 <= m && p2 <= r){//逆序对的条件 左边的数大于右边的数if (a[p1] > a[p2]){std::cout << a[p1] << " " << a[p2] << std::endl;}//当左边严格大于右边时,才将左边的数字拷贝到help[]//不能是大于等于,因为这样才不会少统计   help[i++] = a[p1] > a[p2] ? a[p1++] : a[p2++];}while (p1 <= m){help[i++] = a[p1++];}while (p2 <= r){help[i++] = a[p2++];}for (int j = 0; j < i; j++){a[l + j] = help[j];}
}void MergeSort(int  a[], int l, int r)
{if (l < r) {int mid = l + ((r - l) >> 1);//左侧范围上排序求逆序对MergeSort(a, l, mid);//右侧范围上求逆序对MergeSort(a, mid + 1, r);//左组和右组合并的情况下求逆序对merge(a, l, mid, r);}
}int main()
{int a[] = { 1,3,4,2,5,4 };int i = 0, n = 6;MergeSort(a, i, n-1);return 0;
}

左神小和问题逆序对问题面试相关推荐

  1. 算法练习day4——190321(小和、逆序对、划分、荷兰国旗问题)

    归并排序快的原因: 后面的排序利用了前面排序的结果!!! 1.小和问题 在一个数组中, 每一个数左边比当前数小的数累加起来, 叫做这个数组的小和. 求一个数组的小和. 例子:[1,3,4,2,5] 1 ...

  2. android实现数组倒序,5.1.33 33.数组中的逆序对 - Android 校招面试指南

    一.题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 举例分析 例如在数组{7, 5, 6, 4 中, 一共存在5 个逆 ...

  3. 归并排序——求逆序对个数

    求解逆序对个数 逆序对 对于一个包含N个非负整数的数组A[1-n],如果有i < j,且A[ i ]>A[ j ],则称(A[ i] ,A[ j] )为数组A中的一个逆序对. 例如,数组( ...

  4. 左神算法:将单链表的每K个节点之间逆序(Java版)

    本题来自左神<程序员代码面试指南>"将单链表的每K个节点之间逆序"题目. 题目 给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K 个节点之间逆序,如果 ...

  5. 算法?从这里开始(2)——递归,归并排序,小和问题,逆序对问题

    目录 1.递归 2.归并排序 3.小和问题 4.逆序对问题 1.递归 在一个数组中找最大值,最直观的方式的是遍历,当然可以,但我们这次要用递归的方式.怎么做哪? 假设我们有一个数组,最左边元素我们记为 ...

  6. 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你 追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对

    80,猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你 追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为"逆序对"的东 ...

  7. 【2018.12.15】【考试总结】【模拟+逆序对+树状数组+贪心+multiset】爆零之旅

    这是我悲惨的接近爆零的一次考试,但是本蒟蒻不能放弃,还是要总结的QAQ 答题卡 [题目背景] 八月是个悲惨的月份.先不谈炎热的天气,对于新生来说,八月意味着军训: 而对于高二高三的同学来说,八月意味着 ...

  8. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

  9. Tido 习题-二叉树-树状数组求逆序对

    这里给大家提供一个全新的求逆序对的方法 是通过树状数组来实现的 题目描述   样例输入 Copy 5 2 3 1 5 4 样例输出 Copy 3 提示       #include<iostre ...

最新文章

  1. matlab中bitget函数用法_MATLAB中SVM的用法
  2. linux存储--进程栈 线程栈 内核栈 中断栈(十六)
  3. gesturedetector.java_我的flutter代码中的GestureDetector不起作用
  4. js小学生图区_推荐12个最好的 JavaScript 图形绘制库
  5. 疫情向左、大基金向右,国产光刻胶走到了哪一步?
  6. 超过130个你需要了解的vim命令
  7. http缓存与cdn相关技术
  8. js通过图片url获取图片base64编码
  9. Android Studio 的原生输入框控件 EditText 属性配置详解
  10. 三相PWM整流器滞环电流控制仿真
  11. python复数运算程序_python复数及计算法则
  12. 重磅消息,Micrium的uCOS全家桶将推出免费商业授权
  13. frp服务端(frps) 安装及使用
  14. 半群 群 阿贝尔群 环 整数环 多项式环
  15. 商标起名禁区,看了少走弯路
  16. 踩坑日志1----从zuulFilter到Filter
  17. 第三阶段.Linux+arm
  18. 新华社客户端文章:区块链金融:新蓝海还是新挑战
  19. 计算机网络-CPT实验
  20. Python获取免费代理IP,并全部测试一遍,结果大失所望

热门文章

  1. View Agent Direct-Connection安装后,连接黑屏
  2. 一个基于 React 开发的PC端音乐App
  3. python3 collections数据类型模块
  4. “strcpy” 模拟的实现
  5. 首个诞生于长期支持计划的版本Node.js 4.2 “Argon”正式发布
  6. Macbook pro wifi连接无线路由不稳定掉线的解决办法
  7. 发布npm包时遇到的问题及解决方法
  8. 你所不知道的模块调试技巧 - npm link #17
  9. ORA-12899: value too large for column (actual: 27, maximum: 20)错误解决
  10. Redis面试 - Redis 主从架构