(C/C++)2-路归并排序
2016-09-22 20:24
155 查看
#include<iostream>
//#include<cstdlib>
#include <typeinfo>
#define N 100
using namespace std;
void Merge(int* R,int low,int mid,int high)
{
//用分治法对R[low..high]进行二路归并排序
//int *R1=(int*)malloc((high-low+1)*sizeof(int));
int *R1=new int[high-low+1];
int i,j,p=0;
i=low; j=mid+1;
if(!R1)
{
return; //申请空间失败
}
while(i<=mid&&j<=high) //两子文件非空时取其小者输出到R1[p]上
{
R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
}
while(i<=mid) //若第1个子文件非空,则复制剩余记录到R1中
{
R1[p++]=R[i++];
}
while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中
{
R1[p++]=R[j++];
}
for(p=0,i=low;i<=high;i++,p++)
{
R[i]=R1[p]; //归并完成后将结果复制回R[low..high]
}
delete [] R1;
}
void MergeSort(int* R, int low,int high)
{
int mid;
mid=(low+high)/2;
if(low<high)
{
MergeSort(R,low,mid); //递归将[low..mid]进行排序
MergeSort(R,mid+1,high); //递归将[mid+1..high]进行排序
Merge(R,low,mid,high); //将上面两组有序数列 合并到R[low..high]中
}
}
int main()
{
int R
;
int i,n,low,high;
cin>>n;
low=0;high=n-1;
for(i=0;i<n;i++)
cin>>R[i];
MergeSort(R,low,high);
for(i=0;i<n;i++)
cout<<R[i]<<" ";
return 0;
}
//#include<cstdlib>
#include <typeinfo>
#define N 100
using namespace std;
void Merge(int* R,int low,int mid,int high)
{
//用分治法对R[low..high]进行二路归并排序
//int *R1=(int*)malloc((high-low+1)*sizeof(int));
int *R1=new int[high-low+1];
int i,j,p=0;
i=low; j=mid+1;
if(!R1)
{
return; //申请空间失败
}
while(i<=mid&&j<=high) //两子文件非空时取其小者输出到R1[p]上
{
R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
}
while(i<=mid) //若第1个子文件非空,则复制剩余记录到R1中
{
R1[p++]=R[i++];
}
while(j<=high) //若第2个子文件非空,则复制剩余记录到R1中
{
R1[p++]=R[j++];
}
for(p=0,i=low;i<=high;i++,p++)
{
R[i]=R1[p]; //归并完成后将结果复制回R[low..high]
}
delete [] R1;
}
void MergeSort(int* R, int low,int high)
{
int mid;
mid=(low+high)/2;
if(low<high)
{
MergeSort(R,low,mid); //递归将[low..mid]进行排序
MergeSort(R,mid+1,high); //递归将[mid+1..high]进行排序
Merge(R,low,mid,high); //将上面两组有序数列 合并到R[low..high]中
}
}
int main()
{
int R
;
int i,n,low,high;
cin>>n;
low=0;high=n-1;
for(i=0;i<n;i++)
cin>>R[i];
MergeSort(R,low,high);
for(i=0;i<n;i++)
cout<<R[i]<<" ";
return 0;
}