题目描述

输入 N 组数据,对每组数据输出逆序对个数。

输入

对于每组测试用例,第一行输入此组数据元素个数 x,接下来 x 行,每行一个数,表示元素。(1≤x≤500000)(1≤x≤500000)

当读入的元素个数 x 为零时,程序结束。

输出

对于每组测试用例,输出一个数,表示逆序对个数。

样例输入

5
9
1
0
5
4
3
1
2
3
0

样例输出

6
0

数据规模与约定

时间限制:1 s

内存限制:256 M

100% 的数据保证 1≤x≤500000

解答:

逆序对定义:设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。

根据逆序对定义可知,如果寻找一个序列中逆序对的数量相当于寻找一个序列中每个数后面有多少个小于自己的数,将这些数加起来就是最后的答案。

所以一种暴力的算法就直接出来了,两层for循环,每次取一个数依次和他后面的数进行比较,如果小于这个数,逆序对数加1否则继续向后比较。这也是最暴力的算法,时间复杂度O(n)。

上述算法只是为了找到每一个数后面有多少个数小于他自己,,其实可以对其进行排序,然后看每一个数进行了多少次交换。对交换的次数进行统计即可得到最后的结果。排序有好多算法,最好的排序算法是快速排序,但他是不稳定的,并不适合这道题,所以我们选择一种稳定,并且相对效率较高的归并排序。下面附上代码。

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX_N 500000
int n, a[MAX_N  +5], temp[MAX_N + 5];
long long num;void merge(int begin, int mid, int end)
{int i = begin;int j = mid + 1;int k = begin;while (i <= mid && j <= end){if (a[i] > a[j]) {temp[k] = a[j];k++;j++;num += mid - i + 1; //对交换的次数进行统计} else {temp[k] = a[i];k++;i++;}}while (i <= mid) {temp[k] = a[i];k++;i++;}while (j <= end) {temp[k] = a[j];k++;j++;}for (int p = begin; p <= end; p++)a[p] = temp[p];
}void mergesort(int begin, int end) { //归并排序if (begin >= end)return;int mid = (begin + end) / 2;mergesort(begin, mid);mergesort(mid + 1, end);merge(begin, mid, end);
}int main()
{while (1) {cin >> n;if (n == 0) break;for (int i = 0; i < n; i++) cin >> a[i];num = 0;mergesort(0, n - 1);cout << num << endl;}
​return 0;
}

以上就是本题的代码,有什么问题欢迎随时提问。

-9 逆序输出一个整数的各位数字_逆序对个数(归并排序)相关推荐

  1. -9 逆序输出一个整数的各位数字_计算机基础知识: 信息数字化

    计算机.数据与信息 无符号位数的表示 (一).四种常用的数制及它们之间的相互转换: 进制 基数 基数个数 权 进数规律 十进制 0.1.2.3.4.5.6.7.8.9 10 10i 逢十进一 二进制 ...

  2. -9 逆序输出一个整数的各位数字_【每日算法】基础算法——归并排序[求逆序对的数量](四)(思想很经典)...

    题目内容 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量. 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆 ...

  3. -9 逆序输出一个整数的各位数字_【Java编程基本功】(八)逆序输出、是否为回文数,判断星期几,升序排列...

    第二十四题 给一个不多于5位的正整数,要求:一.求它是几位数,二.逆序打印出各位数字. 代码: public 第二十五题 一个5位数,判断它是不是回文数. 代码: public 代码2: public ...

  4. -9 逆序输出一个整数的各位数字_leetcode两数相加(大整数相加)

    题目来源于leetcode第二题两数相加. 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字. 如果,我们将这两个数相 ...

  5. 如何逆序输出一个整数

    给出一个整数,将它逆序输出,首先求出它是一个几位数,利用for循环将数字从高位到低位分别输出.例如1234这个数,首先通过for循环求出,它是一个4位数,然后1234第一次除以1000,得到1并输出, ...

  6. python输入一个正整数、将其按逆序输出_Python实现按照指定要求逆序输出一个数字的方法...

    本文实例讲述了Python实现按照指定要求逆序输出一个数字的方法.分享给大家供大家参考,具体如下: 问题是:输入一个数字,按照指定要求逆序输出该数字,很简单,下面是实现: #!usr/bin/env ...

  7. java实现:使用递归编写一个程序,逆序输出一个非负整数。例如输入1234,输出4321(不含前导0)。

    验证集:  输入>输出 123>321 120>21 2040>402 204000>402 直接给代码,注释应该够了. //使用递归编写一个程序,逆序输出一个非负整数. ...

  8. c语言逆序输出6A8F,【C语言】将二进制数逆序输出。比如6为000...0110,逆序后为0110....

    //将二进制数逆序输出.比如6为000...0110,逆序后为0110...000#include unsigned int reverse_bit(int num){int i;int bit;un ...

  9. c语言任意整数正序输出,C语言—正序,逆序输出任意整数的每一个数字

    从2016年大一进校进入计算机专业也有一段时间了,对这个行业也有了自己的理解和想法,从中我感受到了计算机的特别,从代码中也能发现属于自己的乐趣,也坚定了我在这条道路上走下去的信心. 为了能更好的和网上 ...

最新文章

  1. 前端培训_backbone
  2. linux awk命令用途,Linux:“awk”命令的妙用
  3. 关于继承构造器的调用
  4. arthas命令使用示例:watch
  5. 同步通信和异步通信的区别
  6. 牛客网暑期ACM多校训练营(第三场)A - PAXM Team(01背包)
  7. Windows Server 2008 系统上c#读取Excel遭遇“用户代码未处理 ComException”错误
  8. docker提交容器成一个新的镜像commit和push,以及docker常用命令
  9. 批处理查找html,批处理(bat)实现全盘搜索指定文件获取其完整路径方法大全,bat大全分享...
  10. 吴恩达神经网络和深度学习-学习笔记-43-Bounding box 预测 + YOLO算法
  11. 机器学习中的Bias,Error,Variance的区别
  12. gps高斯utm_高斯投影与UTM投影
  13. 服务器状态显示异常,进lol显示服务器异常请稍后再试
  14. 图像美学质量评价技术综述
  15. 如何有效地学习知识,如何才能全面发展?
  16. 计算机网络————IP地址分类以及网络地址的计算
  17. Windows下使用ffmpeg录屏和录音
  18. php twig if,twig基本语法
  19. 性能分析系列-小命令保证大性能
  20. esp32外设使用-MCPWM故障处理模块使用

热门文章

  1. 【学习笔记】java核心技术学习笔记整理
  2. 第五章(1)Libgdx应用框架之生命周期
  3. jquery ui tabs详解(中文) 【转载】
  4. c语言巩固,巩固一下C语言中的指针
  5. mysql 视图 分页_mysql查看所有存储过程,函数,视图,触发器,表,分页
  6. Bootstrap静态cdn
  7. java 内存分布_一图看懂JVM内存分布,永久记住!
  8. [转载] Python进阶:设计模式之迭代器模式
  9. Java BigDecimal add()方法与示例
  10. Java ObjectStreamClass lookup()方法与示例