二路合并排序算法
来源:互联网 发布:java将int转换成date 编辑:程序博客网 时间:2024/05/22 09:03
//分治排序
//分解:将n个元素分解成n/2个子序列
//解决:用合并排序法递归的排序个子序列
//合并:合并两个已排序好的子序列
//本人水平有限,此代码指供参考,如有错误请赐教,我会及时更新文章。
#include <iostream>
using namespace std;
const int num=16;
//合并已经排序好的数据,
void merge(int *p,int n1,int n2,int n3)//1 1 2 //0 2 4
{
//当合并数据下标为1,1,2是,要合并的数据元素为第一个和第二个。
int len=(n2==n1)?1:((n3-n1+1)/2);
int *A=new int[len];
int *B=new int[len];
for (int z=0;z<len;z++)
{
A[z]=p[n1+z-1];//A,B保存临时要合并的数据
B[z]=p[n2+z];
}
int i=0,j=0;
int n11=n1-1;
if (n1<=n2&&n2<n3)
{
//取出A,B中小的元素写到p
while (i!=len&&j!=len)
{
if (A[i]>B[j])
{
p[n11++]=B[j++];
}
else if (A[i]<B[j])
{
p[n11++]=A[i++];
}
else
{
p[n11++]=A[i++];
p[n11++]=B[j++];
}
if (i==len&&j!=len)
{
while (j!=len)
{
p[n11++]=B[j++];
}
}
if (j==len&&i!=len)
{
while (i!=len)
{
p[n11++]=A[i++];
}
}
}
}
}
//递归分解子序列
void merge_sort(int *p,int first,int last)
{
if (last>first)
{
int temp=(first+last)/2;
merge_sort(p,first,temp);
merge_sort(p,temp+1,last);
merge(p,first,temp,last);
}
}
void main()
{
int iData[num]={9,1,13,5,2,8,10,7,15,6,11,12,16,4,14,3};
std::cout<<"原数据为: ";
for (int i=0;i<sizeof(iData)/4;i++)
{
std::cout<<iData[i]<<" ";
}
merge_sort(iData,1,sizeof(iData)/4);
std::cout<<endl<<"排序后数据为: ";
for (int j=0;j<sizeof(iData)/sizeof(int);j++)
{
std::cout<<iData[j]<<" ";
}
std::cout<<endl;
}
- 二路合并排序算法
- 排序算法(二):合并排序
- 排序算法二-堆,希尔,合并排序
- java 合并排序算法(二)
- Algorithm--二路合并排序
- 排序算法之二——合并排序
- Erlang的算法-(二)合并排序/归并排序
- 排序算法 两路合并排序
- 排序算法---合并排序
- 排序算法-合并排序
- 算法导论学习笔记(二):合并排序
- 死磕算法导论(二)合并排序
- (二)合并排序
- 合并排序算法
- 合并排序算法
- 算法-----合并排序
- java 合并排序算法
- 合并排序算法
- Fork——分道扬镳的开始
- 关于alarm函数
- 三层构架的理解
- C#中的封装
- 设计模式之四--Prototype(原型)
- 二路合并排序算法
- 转贴:《史记 • 王石列传 》
- PB成功导入数据格式
- C#中的抽象
- 什么是IDE
- 物业公司保安工作的管理认识和学习体会
- (转)介绍Linux操作系统下的几个小游戏模拟器
- (转)介绍Linux操作系统下的几个小游戏模拟器
- 大学运动会总结报告 北京大学第10届运动会工作总结报告