归并排序 小结
来源:互联网 发布:linux日志服务器配置 编辑:程序博客网 时间:2024/06/06 10:55
前几天做了一个逆序数的题,用到了归并排序,就可了解了一下,归并排序算是比较高效的排序算法,复杂度为o(n*lgn),
分析问题可以分为三步
1.划分问题
2.递归求解
3.是合并
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
using namespace std;
//归并排序
void merge_sort(int *A,int x,int y,int *B)
{
if(y-x>1)
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
merge_sort(A,x,m,B);
merge_sort(A,m,y,B);
while(p<m||q<y)
{
if(q>=y||(p<m&&A[p]<=A[q]))
B[i++]=A[p++];
else
B[i++]=A[q++];
}
for(int i=x;i<y;i++)
A[i]=B[i];
}
}
int main()
{
int a[105],b[105],n;
cin>>n;
while(n--)
{
for(int i=0;i<6;i++)
cin>>a[i];
merge_sort(a,0,5,b);
for(int i=0;i<6;i++)
cout<<a[i]<<" ";
cout<<endl;
}
return 0;
}
应用:逆序数的计算
逆序数对问题:给出一列数,求有多少有序对(i,j)i<j,a[i]>a[j]
根据归并排序的启发,也可以用三步走的策略解决这个问题
1.划分问题,将所有数分为两半
2.递归求解i在和j均在左边或均在右边的逆序数对数
3.合并,i在左边j在右边的逆序数对数
万事都是美好的么恰好在归并排序的同时可以计算逆序数
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <map>
using namespace std;
//归并排序
int sum;
void merge_sort(int *A,int x,int y,int *B)
{
if(y-x>1)
{
int m=x+(y-x)/2;
int p=x,q=m,i=x;
merge_sort(A,x,m,B);
merge_sort(A,m,y,B);
while(p<m||q<y)
{
if(q>=y||(p<m&&A[p]<=A[q]))
B[i++]=A[p++];
else
{ B[i++]=A[q++];
sum+=m-p;
}
}
for(int i=x;i<y;i++)
A[i]=B[i];
}
}
int main()
{
int a[105],b[105],n;
cin>>n;
while(n--)
{
for(int i=0;i<6;i++)
cin>>a[i];
sum=0;
merge_sort(a,0,5,b);
cout<<sum<<endl;
}
return 0;
}
#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <map>using namespace std;//求逆序数对int sum=0;void merge_sort(int *A,int x,int y,int *B){ if(y-x>1) { int m=x+(y-x)/2; int p=x,q=m,i=x; merge_sort(A,x,m,B); merge_sort(A,m,y,B); while(p<m||q<y) { if(q>=y||(p<m&&A[p]<=A[q])) B[i++]=A[p++]; else {B[i++]=A[q++]; sum+=m-p; } } for(i=x;i<y;i++) A[i]=B[i]; }}int main(){ int a[1005],b[1005],n; cin>>n; int h=n,x; while(n--) { scanf("%d",&x); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(int i=0;i<x;i++) scanf("%d",&a[i]); sum=0; merge_sort(a,0,x,b); cout<<"Scenario #"<<h-n<<":"<<endl<<sum<<endl; cout<<endl; } return 0;}
- 归并排序小结
- 归并排序 知识点小结
- 归并排序 小结
- 归并排序 -- 算法小结
- 排序算法小结-归并、基数排序
- 算法小结--快速排序+归并排序
- 排序小结--希尔排序--快排--堆排序--归并排序
- 算法之排序小结2---归并排序(Java)
- 小结排序--插入排序/冒泡排序/选择排序/堆排序/归并排序
- 归并排序-归并排序
- LeetCode 148. Sort List 解题报告(归并排序小结)
- 算法入门---java语言实现的归并排序小结
- 冒泡、选择、快速、插入、希尔、归并排序算法的小结
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 微软2017 第四题
- Android Studio同时打开多个项目
- LSM算法原理
- oracle TCL事务控制语言及 运算符
- 虚函数和纯虚函数
- 归并排序 小结
- 网易云课堂 Linux内核分析(七)
- hihocode——#1497 : Queen Attack
- Mac 10.11.6 Mysql
- 运维笔记40 Linux系统监控之Cacti(Cacti搭建,自动抓取cacti统计图片脚本)
- 数据结构—2207: 实现链表(线性表)
- C语言编程基础-struct和union
- HDP错误汇总
- spring中context:property-placeholder/元素