首页 > 其他分享 >归并排序统计逆序对的数量

归并排序统计逆序对的数量

时间:2023-10-31 12:55:53浏览次数:43  
标签:归并 int mid merge 排序 逆序

788. 逆序对的数量 - AcWing题库

 

昨天刚好做到这题,发现网上题解都讲的不是很详细,于是决定自己手写一篇。

 

归并排序能统计逆序对的数量

 

为什么归并排序能统计逆序对数量???

归并排序的特点是,以mid,mid+1为分界,对两边分别进行排序

借助递归的性质先将两边都从小到大排好序,之后再进行合并

 

一旦发现左边有一个数字比右边大,从这个数字开始一直到mid都会比右边的这个数字大

 

这里是相对这个数字而言,因此不会记重

 

每一层最后都合并回去排序好的结果,给下一层用

 

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 const int N = 2e5 + 10;
 7 
 8 int n;
 9 ll ans;
10 int a[N];
11 int q[N];
12 
13 void merge_sort(int l, int r)
14 {
15     if (l >= r)return;
16 
17     int mid = l + r >> 1;
18 
19     merge_sort(l, mid), merge_sort(mid + 1, r);
20 
21     int i = l, j = mid + 1;
22     int k = 0;
23 
24     while (i <= mid && j <= r)
25     {
26         if (a[i] <= a[j])
27         {
28             q[k++] = a[i++];
29         }
30         else
31         {
32             q[k++] = a[j++];
33 
34             ans += mid - i + 1;
35         }
36     }
37 
38     while (i <= mid)q[k++] = a[i++];
39 
40     while (j <= r)q[k++] = a[j++];
41 
42     for (int i = l, j = 0; i <= r && j < k; i++, j++)
43     {
44         a[i] = q[j];
45     }
46 }
47 
48 int main()
49 {
50     cin >> n;
51 
52     for (int i = 1; i <= n; i++)cin >> a[i];
53 
54     int l = 1, r = n;
55 
56     merge_sort(l, r);
57 
58     cout << ans << endl;
59 
60     return 0;
61 }

 

标签:归并,int,mid,merge,排序,逆序
From: https://www.cnblogs.com/mynewlifeonline/p/17799987.html

相关文章

  • 【算法题】2826. 将三个组排序
    题目:给你一个下标从0开始长度为n的整数数组nums。从0到n-1的数字被分为编号从1到3的三个组,数字i属于组nums[i]。注意,有的组可能是空的。你可以执行以下操作任意次:选择数字x并改变它的组。更正式的,你可以将nums[x]改为数字1到3中的任意一个。你将按......
  • 复仇归并排序
     归并排序就是,把一群数据一直分,一直分,分到不能再分之后,一个个按顺序把你们装进去 讲讲第一个难点,上面两个mergesort归并,其实这是一个把人给分开,分成两组,接着再分,再分。。。分到没办法分的时候,往下走。。。然后接着就是定义指针ijk,然后就有一个困扰了我很久的问题,为什么可......
  • 排序算法——冒泡,插入,选择排序
    冒泡排序冒泡排序是一种简单的排序算法实际上是每一次排序都会将最大的元素放到最后比较相邻的元素,如果第一个比第二个大,就交换他们两个对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数针对所有的元素重复以上的步骤点击查看......
  • 快速排序学习
    //#include<bits/stdc++.h>#include<iostream>usingnamespacestd;voidquick_sort(intq[],intl,intr){if(l>=r)return;intx=q[(l+r)/2];inti=l-1,j=r+1;while(i<j){doi++;while(q[i]<x);doj--;while(q[j]>......
  • 排序(按照第一元素)
    按照元素的第一顺序排序//maybe贪心会用到structty{ intx,y;}a[N];boolcmp(tya,tyb){ if(a.x<b.x)returntrue; returnfalse;}intmain(){ intn; cin>>n; for(inti=1;i<=n;i++) { cin>>a[i].x>>a[i].y; } sort(a+......
  • 快速排序--排序算法
    快速排序介绍快速排序是分治思想的一种体现,通过递归不断将原数列划分为一大一小两部分,从而实现对数列的排序。算法时间复杂度为O(nlogn)。特点是数据越混乱,效率越高;数据越有序,效率越低。值得注意的是快速排序是不稳定的,即相同大小的数据在排序前后的相对位置可能会发生变动。......
  • Cxgrid获取选中行列,排序规则,当前正在编辑的单元格内的值
    cxGrid,数据库中存在:GongSiNo,GongSiMc;cxGrid中显示列GongSiMc,Properties指定的是ComBoBox,GongSiMc变化时更新GongSiNo的值并存入数据库。在Properties的OnChange事件中写代码:{GSNo,GSMc:string;}GSMc:=cxgrdCZYDBTableView1.Controller.EditingController.Edit.EditingValue;......
  • 排序算法:选择排序,分别用c++、java、python实现
    选择排序介绍选择排序(SelectionSort)是一种简单的比较排序算法,它的工作原理如下:分区:将待排序的数组分成两个部分,一个部分是已排序的子数组,另一个部分是未排序的子数组。初始时,已排序的子数组为空,而未排序的子数组包含整个数组。选择最小值:从未排序的子数组中找到最小(或最大,根据......
  • 按Value对Map进行排序,技术大佬们都在用这个方法
    在Java中,Map的排序一般会根据Key或者Value来进行。按照Value对Map进行排序,通常会用在以下几种场景。1.数据可视化:如果你正在创建一个数据可视化工具,你可能会需要根据数据的值来进行排序。例如,你可能有一个表示员工工资的Map,你想要根据工资值来对员工进行排序,并在图表中展示。2.......
  • 整型数组按照字典序排序
    整型数组按照字典序排序输入...0,1,2,3,5,7,8,1001,109...输出...0,1,10,1001,2,3,5,7,8Collections.sort(list,newComparator<Integer>(){@Overridepublicintcompare(Integero1,Integero2){StringA=o1+"";StringB=......