链接51nod1019

归并排序

归并操作的工作原理如下:(摘自百度百科)

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

例子

归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。

如 设有数列{6,202,100,301,38,8,1}

初始状态:6,202,100,301,38,8,1

第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;

第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;

第三次归并后:{1,6,8,38,100,202,301},比较次数:4;

总的比较次数为:3+4+4=11;

逆序数为14;

具体代码如下:

本题数据较大  应该用longlong

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
using namespace std;
#define INF 2000000000
const int MAX=100000;
typedef long long ll;
ll l[MAX/2],r[MAX/2];
ll n,ans=0;
ll a[MAX];
void merge(ll a[],int left,int mid,int right){  int n1=mid-left;  int n2=right-mid;  for(int i=0;i<n1;i++)l[i]=a[left+i];  for(int i=0;i<n2;i++)r[i]=a[mid+i];  l[n1]=r[n2]=INF;  int i=0,j=0;  for(int k=left;k<right;k++){  if(l[i]<=r[j])a[k]=l[i++];  else a[k]=r[j++],ans+=n1-i;  //重点 }
}
void mergeSort(ll a[],int left,int right){  if(left+1<right){  int mid=(left+right)/2;  mergeSort(a,left,mid);  mergeSort(a,mid,right);  merge(a,left,mid,right);  }
}
int main(){  cin>>n;  for(int i=0;i<n;i++)cin>>a[i];  mergeSort(a,0,n);  //for(int i=0;i<n;i++)cout<<a[i]<<" "; printf("%I64d",ans);
}  

51Nod1019----归并排序(递归)相关推荐

  1. 6-6 归并排序(递归法) (10分)

    6-6 归并排序(递归法) (10分) 本题要求实现二路归并排序中的归并操作,待排序列的长度1<=n<=1000. 函数接口定义: void Merge(SqList L,int low, ...

  2. 归并排序 (递归+非递归)

    文章目录 1. 归并排序 递归 1.基本思想 2. 使用两个函数完成归并 3. 递归结束条件 4.时间复杂度与空间复杂度计算 1. 时间复杂度 2. 空间复杂度 5. 代码 2. 归并排序 非递归 1 ...

  3. C++归并排序递归写法

    归并排序的核心:有序子列的归并 两个有序子列,三个指针 A子列,指针Aptr指向首地址 1 13 24 26 B子列,指针Bptr指向首地址 2 15 27 38 Tmp数组,指针Cptr首地址 比较 ...

  4. java 归并排序 非递归_归并排序-递归及非递归的JAVA实现

    归并排序介绍 平均时间复杂度: O(NLogN) 最好情况时间复杂度: O(NLogN) 最差情况时间复杂度: O(NLogN) 所需要额外空间: 递归:O(N + LogN), 非递归:O(N) 稳 ...

  5. 归并排序(递归实现+非递归实现+自然合并排序)

    归并排序的确是分治思想的经典代表.写了很多次,这次又有新的收获,过去用的是递归的实现方式,理论上任何用递归方法实现的代码都可以转换为非递归的形式,所以此例也不例外.然后再用非递归的实现方法上进行改进, ...

  6. 归并排序 | 递归 非递归 |C语言

    一.递归算法 // L = 左边起始位置,R = 右边起始位置,RightEnd = 右边终点位置 void Merge(ElementType A[], ElementType TmpA[], in ...

  7. 【归并排序+递归】LeetCode 148. Sort List

    LeetCode 148. Sort List Solution1:我的答案 很多递归 /*** Definition for singly-linked list.* struct ListNode ...

  8. 归并排序 (递归 非递归)

    一.递归版本

  9. 归并排序递归 java实现

    package sort; public class MergeSort1 {       /*** 归并排序       * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为 ...

  10. 归并排序(二路、递归)

    归并排序 排序策略 将两个有序表归并为一个新的有序表 排序过程 i与j分别是两个有序表的所索引 ①当i和j 都在两个表的表长内变化时, 根据对应项的排序码的大小, 依次把排序码小的对象排放到新表 k ...

最新文章

  1. intel 82579v驱动下载_最新INTEL和AMD平台轻松安装WIN7,集成M.2和USB3.0驱动
  2. Django REST framework API 指南(2):响应
  3. WWDC的31个年头,来点不一样的!听说库克还忍不住要收割13岁以上程序员
  4. 基于PYQT编写一个人脸识别软件
  5. String与List类型互转
  6. 在一台机器上运行多个ActiveMQ实例
  7. 【开源】Transformer 在CV领域全面开花:新出跟踪、分割、配准等总结
  8. PHP正则表达式转义符对照
  9. 深度访谈: 怎样玩转天猫?看这九本书就够了
  10. 2021-08-1320210813SONY的专业DSD播放格式(DSF)转WAV的方法
  11. AirSim中的物理引擎
  12. java实现zip文件压缩和解压
  13. 配置KDiff3作为GIT merge图形化工具
  14. anaconda prompt提示系统找不到指定的路径
  15. 手游服务器价格表,杭州高防43.241.17.1
  16. 用java编写中国象棋_如何用Java实现网络中国象棋室(一)
  17. Android源码分析-dex2oat
  18. Fourier Neural Operator for Parametric Partial Differential Equations
  19. 中介者(Mediator)
  20. 语音识别之HTK入门(二)

热门文章

  1. 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink
  2. Qt数据库集成应用封装
  3. JavaCore HeapDump
  4. Instruments-Automation: 通过命令行执行测试用例
  5. Shader预处理宏、内置状态变量、多版本编译等
  6. linux之源程序编译安装
  7. 增加批量修改成本价格,配合后台管理增加成本价和毛利润统计
  8. 如何查看mysql 的端口号?
  9. redis如何选择合适的数据结构
  10. Unity用GUI绘制Debug/print窗口/控制台-打包后测试