目录

1.归并排序过程

(1)逆序对概念

(2)基本思想

(3)算法实现


1.归并排序过程

使用归并排序实现求逆序对,那么首先得了解什么是归并排序(关于归并排序可以求逆序对,也是在做题中学会的)。

首先得了解归并排序本身的思想,再来了解使用归并排序求逆序的过程:

1.算法思想:
合并排序是采用分治策略实现对N个元素进行排序的算法,是分治法的一个典型应用和完美体现,它是一种平衡,简单的二分分治策略,计算过程分为三步:

  • (1)分解:将待排序元素分成大小大致相同的两个子序列。
  • (2)求解子问题:用合并排序法分别对两个子序列递归地进行排序。
  • (3)合并:将排好序的有序子序列进行合并,得到符合要求的有序序列。

例如:设待排序序列A=<8,3,2,9,7,1,5,4>,采用合并排序算法对序列A进行排序。

使用C语言实现各种排序(总结)

(1)逆序对概念

假设两个元素Ai,Aj,并且i<j,但是Ai>Aj,那么(Ai,Aj)构成一对逆序对。

(2)基本思想

基本思想:归并排序是两个有序的序列(a[maxn],b[maxn])进行合并,借助一个辅助的数组aux[maxn],用来记录合并之后的序列;而合并的过程是a[i]和b[j]的值进行比较,如果a[i]的值小于等于b[j]的值,那么首先将a[i]的值放入到aux[k]中(隐含的意义就是a[i]和b[j]两个数是有序的);如果a[i]的值大于b[j]的值,那么首先将b[j]的值放入到aux[k]中(隐含的意义就是a[i]和b[j]两个数是逆序的)。

注意:现在根据这个思想画图来理解。

例如:现在对<3,6,7,4,2,1,5>进行归并排序,只画出合并的过程,分解的过程没有画出。

上图所示:根据刚才表述的思想(可能表述的不是太清楚),比如上面的第二趟归并过程中,middle=1,而left=0,right=3,可以看到元素3和4进行比较,3小于4,是顺序的,所以将3先放入aux[k]中,left下标向右移动;当6和4进行比较时,6大于了4,所以是逆序的,但是仔细看可以发现,要计算4前面到底有多少个是大于它的,直接可以使用(middle-left+1)即可算出,因为合并的每个数组都是有序的数组,所以既然6大于了4,那么如果6的后面还有数据的话,那么一定大于4,所以和4可以构成的逆序对数就是(middle-left+1).依次下面过程的合并也是同样的道理。

计算上面的逆序:count=0;

  • ①第一趟4和7的比较出现逆序,1和2的比较出现逆序,所以逆序数为count=count+2;
  • ②第二趟6和4比较出现逆序,而其他都是顺序,所以逆序数为count=count+1;

  • ③第三趟比较,逆序数为:count=count+10;

  • 最终的逆序数为13.

(3)算法实现

#include<stdio.h>
#include<stdlib.h>
#include<math.h>#define MAXSIZE 11typedef int ElemType;
int merge[MAXSIZE];//合并两个有序子序列
int count=0;
void Merge(int merge[],int a[],int left,int right,int middle){int i=left,j=middle+1;int k=left;while(i<=middle&&j<=right){if(a[i]<=a[j]){merge[k++]=a[i++];}else{merge[k++]=a[j++];count+=middle-i+1;}}while(i<=middle)merge[k++]=a[i++];while(j<=right)merge[k++]=a[j++];i=0;for(i=left;i<=right;i++)a[i]=merge[i];
}
//合并排序算法void Mergesort(int a[],int left,int right){if(left<right){int middle=(left+right)>>1;Mergesort(a,left,middle);Mergesort(a,middle+1,right);Merge(merge,a,left,right,middle);}
}
void display(int a[],int n){for(int i=0;i<n;i++){printf("%d\t",a[i]);}
}int main(){int array[MAXSIZE];int n;for(int i=0;i<MAXSIZE;i++){array[i]=0;}printf("请输入待排关键字个数: ");scanf("%d",&n);printf("请输入关键字: ");for(int i=0;i<n;i++){scanf("%d",&array[i]);}Mergesort(array,0,n-1);display(array,n);printf("\n");printf("逆序对: %d\n",count);return 0;
} 

归并排序求逆序对(C语言)相关推荐

  1. 信息竞赛进阶指南--归并排序求逆序对

    // 归并排序求逆序对 void merge(int l, int mid, int r) {// 合并a[l~mid]与a[mid+1~r]// a是待排序数组, b是临时数组, cnt是逆序对个数 ...

  2. 分治法:归并排序求逆序对

    现给出这个定义,什么是逆序对,NOIP火柴排队这个题是逆序对的一个比较好的例题,这里我们只讨论求逆序对的一些高效的算法 一般有归并排序以及树状数组两种方法,本文只讨论归并排序求逆序对 这里不给出原理只 ...

  3. hust1347(归并排序求逆序对)

    题意: 给出一个数列,你要对这个数列的数字进行k次交换操作,使得交换之后的数列逆序对虽少. 思路: 求原数列的逆序对,再和k比就行了.求逆序对要用归并排序,因为树状数组开不下. 代码: #includ ...

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

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

  5. codeforces 414C C. Mashmokh and Reverse Operation(归并排序求逆序对)

    题目链接: C. Mashmokh and Reverse Operation time limit per test 4 seconds memory limit per test 512 mega ...

  6. 利用归并排序求逆序对

    在逆序对的问题中,如果采用暴力求解的方法,一般也是有效的,但是O(n2)时间复杂度实在是难以接受的.但是对于逆序对问题,却有一个看似不想关的算法来解决–归并排序.时间复杂度和空间复杂度完全与归并排序一 ...

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

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

  8. 逆序对算法c语言,归并排序求逆序对的代码(C语言)

    #include #include #define MAX 32767 int merge(int *array, int p,int q,int r) { //归并array[p...q] 与 ar ...

  9. 【NOI导刊】【归并排序求逆序对】最接近神的人

    题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着"神的殿堂".小FF猜 ...

最新文章

  1. 北京铁路局百余列普速列车将开通WiFi
  2. 自定义的Sort对象
  3. 腾讯游戏应邀2019大数据产业峰会BDIC | 荣获“大数据星河奖”并获颁测评证书...
  4. 16速 java_不停歇的 Java 即将发布 JDK 16,新特性速览!
  5. 训练千亿参数模型的法宝,昇腾CANN异构计算架构来了~
  6. IntelliJ IDEA 2019.1.1 预览版发布,以及对旧版本的更新
  7. ajax提交时“加载中”提示的处理方法
  8. kinect 手势识别的原理?
  9. 微软发布ASP.NET 5路线图
  10. wincc怎么做数据库_关于WINCC通过PLCSIM来进行仿真中要怎么设置?
  11. 正则表达式验证首尾是空格的字符串
  12. (1)numpy.power
  13. java 实现mvcc_HBase中MVCC的实现机制及应用情况
  14. 分享五款可以大幅度提升办公效率的实用软件
  15. matlab R2021b 激活错误
  16. python实现乘法口诀表
  17. 2022华为机试真题 C++ 实现【勾股数元组】
  18. 数据库事务的四大特性和隔离级别,一文带你看通透
  19. “L2TP 链接尝试失败,因为安全层不能与远程计算机协商兼容的参数”解决方案
  20. java中不等于空怎么写_JAVA判断不等于空的情况

热门文章

  1. go 时间戳转日期格式,日期格式转时间戳
  2. 【全集】大数据Java基础
  3. 一范数L1和二范数L2
  4. Git 系列 1:提交修改到远程仓库——详尽版
  5. 分享一本关于程序员的故事书-《一个程序员的奋斗史》
  6. PowerMockup一个产品原型设计PPT插件
  7. 原本好好的程序,怎么电脑重启后就打不开了?
  8. mysql to unixtime_转 善用mysql中的FROM_UNIXTIME()函数和UNIX_TIMESTAMP()函数
  9. Linux系统中的“动态库”和“静态库”
  10. 上采样(upsampling)方法总结