归并排序
来源:互联网 发布:mac能下qq游戏吗 编辑:程序博客网 时间:2024/06/04 04:10
归并排序:(算法伪代码实现可看《算法导论》第三版)
1. 操作
(1) 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列
(2) 解决:使用归并排序递归地排序两个子序列
(3) 合并:合并两个已排序的子序列以产生已排序的答案
2. 代码
#include<iostream>
#include<vector>
usingnamespace std;
vector<int>MERGE(vector<int>&A,int p, int q, int r)
{
vector<int>L(A.begin()+p-1 ,A.begin() + q);
vector<int>R(A.begin()+q ,A.begin() + r );
int i = 0;
int j = 0;
for(int k = p-1; k < r; ++k)
{
if((i < q-p+1)&&(j< r-q))
{
if(L[i] <= R[j])
{
A[k] =L[i];
i = i + 1;
}
else
{
A[k] =R[j];
j = j + 1;
}
}
else
{
if( i < q - p+1)
{
A[k] =L[i];
i = i + 1;
}
else
{
A[k] =R[j];
j = j + 1;
}
}
}
return A;
}
vector<int>MERGE_SORT(vector<int>&A ,int p, int r)
{
if(p<r)
{
int q = (p + r)/2;
MERGE_SORT(A,p,q);
MERGE_SORT(A,q+1,r);
MERGE(A,p,q,r);
}
return A;
}
intmain()
{
int a[] = {4,5,2,0,100,7,8,29,4,6,5,3};
vector<int>b(a, a+12);
MERGE_SORT(b,1,12);
for(int i = 0 ; i < b.size(); ++i)
cout << b[i] <<ends;
cout << endl;
return 0;
}
3.运行时间:
(1)MERGE的运行时间的增长率是:n,其中n = r- p +1;
(2)归并算法的运行时间的增长率是:nlgn;
4.应用:逆序对
假设A[1..n]是一个有n个不同数的数组。若i<j且A[i]>A[j],则对偶(i,j)称为A的一个逆序对,求数组的逆序对。
代码实现:
#include<iostream>
#include<vector>
using namespace std;
vector<int> MERGE(vector<int>&A,int p, int q, int r)
{
vector<int>L(A.begin()+p-1, A.begin() + q);
vector<int>R(A.begin()+q, A.begin() + r );
int i = 0;
int j = 0;
for(int k = p-1; k < r;++k)
{
if((i <q-p+1)&&(j < r-q))
{
if(L[i]<= R[j])
{
A[k]= L[i];
i= i + 1;
}
else
{
A[k]= R[j];
for(intz = i; z < L.size(); ++z)
cout<< "逆序对是: " << L[z] <<ends << R[j] << endl;
j= j + 1;
}
}
else
{
if( i <q - p+1)
{
A[k]= L[i];
i= i + 1;
}
else
{
A[k]= R[j];
j= j + 1;
}
}
}
return A;
}
vector<int> MERGE_SORT(vector<int>&A ,int p, int r)
{
if(p<r)
{
int q = (p + r)/2;
MERGE_SORT(A,p,q);
MERGE_SORT(A,q+1,r);
MERGE(A,p,q,r);
}
return A;
}
int main()
{
int a[] = {2,3,8,6,1,0,9,5};
vector<int>b(a, a+8);
MERGE_SORT(b,1,8);
return 0;
}
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 编写相机程序时遇到的问题
- iOS_长按保存图片
- 微信成功的真正原因
- Machine Learning in R for beginners
- Android学习路径
- 归并排序
- Android4.4.2 DexClassLoader源码分析
- 冒泡排序
- Android fill_parent和wrap_content理解
- 分布式一致性模型
- 怎么把扫描的PDF文档转成PPT格式文档
- SrollView 不能滚动
- Linux基础知识之:目录结构和权限问题介绍
- javaee学习之路(十一)简单工厂模式