排序算法:归并排序(Merge Sort)
归并排序
归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解。
归并排序将排序数组A[1..n]分成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将这两个已排序的子序列进行合并,即得到最终排好序的序列:
**归并排序的时间复杂度为:O(nlgn),其中 MERGE(a,b,c,d)的时间复杂度为O(n)。**如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。
- 将n个元素分成各含有n/2个元素的子序列.
- 对两个子序列递归排序.
- 合并两个已排序的子序列以得到排序结果.
1 void merge(int x,int y){
2 if(x==y)return;
3 int mid=(x+y)/2,i=x,j=mid+1,k=x;
4 merge(x,mid),merge(mid+1,y);
5 while(i<=mid&&j<=y){
6 if(a[i]<=a[j]){
7 c[k++]=a[i++];
8 }else{
9 c[k++]=a[j++],ans+=mid-i+1;
10 }
11 }
12 while(i<=mid)c[k++]=a[i++];
13 while(j<=y)c[k++]=a[j++];
14 for(int l=x;l<=y;l++){
15 a[l]=c[l];
16 }
17 }
归并排序的缺点:不是原地排序,需要额外申请空间来进行排序。
逆序数对求数
给定包含n个不同元素的数组A[1..n],如果i < j且A[i] > A[j],则(i, j)称为数组A的一个逆序。数组包含所有逆序的数量成为数组的逆序数。例对于数组[1, 2, 3, 4, 5],它的逆序有(2, 1), (3, 1), (5, 4), (5, 1), (4, 1),所以该数组的逆序数为5。
这里如果用冒泡排序绝对会RE,所以归并排序。可以看出,消除逆序的操作发生在while循环中:每执行一次循环体都会消除一个逆序。当所有逆序都被消除后,就完成了插入排序。所以,可以通过在插入排序中加入计数计算数组逆序数。
原数组的逆序数是两个子数组逆序数之和加上合并过程中消除的逆序数。
1 while(i <= mid && j <= r){
2 if(a[i] > a[j]){
3 ans += mid - i + 1;
4 b[t++] = a[j];
5 ++j;
6 }else{
7 b[t++] = a[i];
8 ++i;
9 }
10 }
11
建议输入速度更快比如快读。
排序算法:归并排序(Merge Sort)的更多相关文章
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
- 排序算法二:归并排序(Merge sort)
归并排序(Merge sort)用到了分治思想,即分-治-合三步,算法平均时间复杂度是O(nlgn). (一)算法实现 private void merge_sort(int[] array, int ...
- 连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort)
连续线性空间排序 起泡排序(bubble sort),归并排序(merge sort) 1,起泡排序(bubble sort),大致有三种算法 基本版,全扫描. 提前终止版,如果发现前区里没有发生交换 ...
- 第23章 排序算法(包括merge等)
第23章 排序算法 Sorting:1 sort Sort elements in range (function template)2 stable_sort Sort elements pr ...
- 数据结构和算法(Golang实现)(23)排序算法-归并排序
归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- 经典排序算法 - 基数排序Radix sort
经典排序算法 - 基数排序Radix sort 原理类似桶排序,这里总是须要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,临时忽视十位数 比如 待排序数组[ ...
- oracle表连接------>排序合并连接(Merge Sort Join)
排序合并连接 (Sort Merge Join)是一种两个表在做连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的连接方法. 对于排序合并连接的优缺点及适用场景例如以下: a,通常 ...
- 排序算法--插入排序(Insertion Sort)_C#程序实现
排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- 排序算法--冒泡排序(Bubble Sort)_C#程序实现
排序算法--冒泡排序(Bubble Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来非常困 ...
随机推荐
- 工作不到一年,做出了100k系统,老板给我升职加薪
看了下自己上一次发技术文还是在6月15日,算了算也是两个来月了.别怕,短暂的离开,是为了更好的相遇. 来到新公司以后啊,发现公司的搜索业务是真的太多了,大大小小有几百个搜索业务.来了之后得先梳理.熟悉 ...
- Android-PullToRefresh上拉下拉刷新加载更多,以及gridview刷新功能的Library下载地址
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处. 首先大家应该都听说过此开源框架的强大之处,支持单列以及双列的 上拉加载以及下拉刷新功 ...
- Database4.exe用来导入excel
从ACCESS数据库导出的EXCEL表格,可以通过database4.exe来连接,并导出sql脚本,再用database4.exe来连接ACCESS并先创建于脚本结构一致的表,然后复制脚本,从新生成 ...
- shader效果
Unity Shader - 消融效果原理与变体 https://www.jianshu.com/p/d8b535efa9db
- Unity技巧集合
地址:http://blog.csdn.net/stalendp/article/details/17114135 这篇文章将收集unity的相关技巧,会不断地更新内容. 1)保存运行中的状态 uni ...
- [BUUOJ记录] [ACTF2020 新生赛]Include
本题主要考查了利用php://filter伪协议进行文件包含 进入题目根据Tip进入正题,可以看到URL中存在文件包含(题目名也很直接) 首先考虑 "php://input"伪协议 ...
- Explain Plan试分析
注:以下是本人对Explain Plan的试分析,有不对的地方希望大家指出.关于如何查看Oracle的解释计划请参考:https://www.cnblogs.com/xiandedanteng/p/1 ...
- AMQP 概论
AMQP 是应用层协议的一个开放标准,为面向消息的中间件设计.基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制.目标是实现一种在全行业广泛使用的标准消 ...
- 3.AVPacket使用
1.使用注意 AVPacket需要用户通过av_packet_allc()创建好空间后.才能供给fimpeg进行获取解码前帧数据,由于解码前帧数据大小是不固定的(比如I帧数据量最大)所以ffmpeg会 ...
- Typora第一次使用
一级标题 二级标题 三级标题 三个# + 空格 分割线 三个- 三个* 粗体 ctrl + B 斜体 ctrl + I 删除线 引用 一个大于号就可以了 图片: ! + [] + (图片路径) 超链接 ...