#include <iostream>
using namespace std;
//subArrLen为有序子数组的长度,
//一次二路归并排序后的有序子序列存于数组swap中
void Merge(int a[],int n,int swap[],int subArrLen)
{
int l1=0;//第一个有序子数组下界为0
int l2=0,u1=0,u2=0;
int i=0,j=0;
int m=0;
while(l1+subArrLen<=n-1)
{
l2=l1+subArrLen;
u1=l2-1;
u2=(l2+subArrLen-1<=n-1)?l2+subArrLen-1:n-1;
for(i=l1,j=l2;(i<=u1 && j<=u2);m++ )
{
if(a[i]<=a[j])
{
swap[m]=a[i];
i++;
}
else
{
swap[m]=a[j];
j++;
}
}
while(i<=u1)
{
swap[m]=a[i];
m++;
i++;
}
while(j<=u2)
{
swap[m]=a[j];
m++;
j++;
}
l1=u2+1;
}
for(i=l1;i<n;i++,m++)
{
swap[m]=a[i];
}
}
void MergeSort(int a[],int n)
{
int *swap=new int[n];
int subArrLen=1;
while(subArrLen<n)
{
Merge(a,n,swap,subArrLen);
for(int i=0;i<n;i++)
{
a[i]=swap[i];
}
subArrLen*=2;
}
delete []swap;
}
int main()
{
int a[]={6,5,4,3,2,1};
MergeSort(a,6);
for(int i=0;i<6;i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
return 0;
}
数据结构之归并排序
最新推荐文章于 2024-07-19 14:23:56 发布