1、递归实现
(1)、将数组a的[l1,r1]与[l2,r2]区间合并为有序区间:
const int maxn=100;
//将数组a的[l1,r1]与[l2,r2]区间合并为有序区间
void merge(int a[],int l1,int r1,int l2,int r2)
{
int temp[maxn]; //先开个大的!
int index=0;
int i=l1;
int j=l2;
while(i<=r1&&j<=r2)
{
if(a[i]<a[j])
{
temp[index++]=a[i++];
}
else
{
temp[index++]=a[j++];
}
}
while(i<=r1)
{
temp[index++]=a[i++];
}
while(j<=r2)
{
temp[index++]=a[j++];
}
/*
for(int k=l1,m=0;k<index;k++,m++)
{
a[k]=temp[m];
}
*/
for(i=0;i<index;i++)
{
a[l1+i]=a[i];
}
}
(2)、将数组的区间[left,right]进行归并排序:
//将数组的区间[left,right]进行归并排序
void mergeSort(int a[],int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
mergeSort(a,left,mid);
mergeSort(a,mid+1,right);
merge(a,left,mid,mid+1,right); //有点类似二叉树的后序遍历
}
}
2、非递归实现
【方式一】merge:
void mergeSort(int a[])
{
for(int step=2;step/2<=n;step*=2)
{
for(int i=1;i<=n;i+=step)
{
int mid=i+step/2-1;
if(mid+1<=n) //右子区间还有元素
{
merge(a,i,mid,mid+1,min(i+step-1,n));
}
//if(mid+step-1<=n) //写的什么!!
}
/*
for(int i=1;i<=n;i+=step)
{
merge(a,i,step/2,step/2+1,i+step-1);
}*/
//WA!!!
}
}
【方式二】sort:
void mergeSort(int a[])
{
for(int step=2;step/2<=n;step*=2)
{
for(int i=1;i<=n;i+=step)
{
sort(a+i,a+min(n+1,i+step)) //尤需记得取二者之小值!
//sort(a+i,a+step-1);
}
}
}

本文深入探讨了归并排序算法的两种实现方式:递归与非递归。详细讲解了如何通过递归调用将数组分割并合并成有序状态,以及如何使用非递归方式通过逐步增加合并步长来排序数组。提供了具体的代码示例,帮助读者理解归并排序的运作机制。
549

被折叠的 条评论
为什么被折叠?



