51Nod1019----归并排序(递归)
链接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----归并排序(递归)相关推荐
- 6-6 归并排序(递归法) (10分)
6-6 归并排序(递归法) (10分) 本题要求实现二路归并排序中的归并操作,待排序列的长度1<=n<=1000. 函数接口定义: void Merge(SqList L,int low, ...
- 归并排序 (递归+非递归)
文章目录 1. 归并排序 递归 1.基本思想 2. 使用两个函数完成归并 3. 递归结束条件 4.时间复杂度与空间复杂度计算 1. 时间复杂度 2. 空间复杂度 5. 代码 2. 归并排序 非递归 1 ...
- C++归并排序递归写法
归并排序的核心:有序子列的归并 两个有序子列,三个指针 A子列,指针Aptr指向首地址 1 13 24 26 B子列,指针Bptr指向首地址 2 15 27 38 Tmp数组,指针Cptr首地址 比较 ...
- java 归并排序 非递归_归并排序-递归及非递归的JAVA实现
归并排序介绍 平均时间复杂度: O(NLogN) 最好情况时间复杂度: O(NLogN) 最差情况时间复杂度: O(NLogN) 所需要额外空间: 递归:O(N + LogN), 非递归:O(N) 稳 ...
- 归并排序(递归实现+非递归实现+自然合并排序)
归并排序的确是分治思想的经典代表.写了很多次,这次又有新的收获,过去用的是递归的实现方式,理论上任何用递归方法实现的代码都可以转换为非递归的形式,所以此例也不例外.然后再用非递归的实现方法上进行改进, ...
- 归并排序 | 递归 非递归 |C语言
一.递归算法 // L = 左边起始位置,R = 右边起始位置,RightEnd = 右边终点位置 void Merge(ElementType A[], ElementType TmpA[], in ...
- 【归并排序+递归】LeetCode 148. Sort List
LeetCode 148. Sort List Solution1:我的答案 很多递归 /*** Definition for singly-linked list.* struct ListNode ...
- 归并排序 (递归 非递归)
一.递归版本
- 归并排序递归 java实现
package sort; public class MergeSort1 { /*** 归并排序 * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为 ...
- 归并排序(二路、递归)
归并排序 排序策略 将两个有序表归并为一个新的有序表 排序过程 i与j分别是两个有序表的所索引 ①当i和j 都在两个表的表长内变化时, 根据对应项的排序码的大小, 依次把排序码小的对象排放到新表 k ...
最新文章
- intel 82579v驱动下载_最新INTEL和AMD平台轻松安装WIN7,集成M.2和USB3.0驱动
- Django REST framework API 指南(2):响应
- WWDC的31个年头,来点不一样的!听说库克还忍不住要收割13岁以上程序员
- 基于PYQT编写一个人脸识别软件
- String与List类型互转
- 在一台机器上运行多个ActiveMQ实例
- 【开源】Transformer 在CV领域全面开花:新出跟踪、分割、配准等总结
- PHP正则表达式转义符对照
- 深度访谈: 怎样玩转天猫?看这九本书就够了
- 2021-08-1320210813SONY的专业DSD播放格式(DSF)转WAV的方法
- AirSim中的物理引擎
- java实现zip文件压缩和解压
- 配置KDiff3作为GIT merge图形化工具
- anaconda prompt提示系统找不到指定的路径
- 手游服务器价格表,杭州高防43.241.17.1
- 用java编写中国象棋_如何用Java实现网络中国象棋室(一)
- Android源码分析-dex2oat
- Fourier Neural Operator for Parametric Partial Differential Equations
- 中介者(Mediator)
- 语音识别之HTK入门(二)