归并排序,这里并没有采用递归算法自上而下,而是直接从下往上
稳定算法;初始序列的不同不会影响算法的时间复杂度
#include<iostream>
using namespace std;
void merge(int a[],int b[],int s,int n);
void merge_detail(int a[],int b[],int l,int m,int r);
void mergesort(int a[],int n)
{
int *b=new int[n];
int s=1;//间距
while(s<n)
{
merge(a,b,s,n);
s+=s;
if(s>=n)
{
for(int im=0;im<n;im++)
{
cout<<b[im]<<" ";
}
cout<<endl;
break;
}
merge(b,a,s,n);
s+=s;
if(s>=n)
{
for(int im=0;im<n;im++)
{
cout<<a[im]<<" ";
}
cout<<endl;
}
}
}
void merge(int a[],int b[],int s,int n)//将a数组中间距为s的两段合并保存在b数组中
{
int i=0;
while(i<=n-2*s)
{
merge_detail(a,b,i,i+s-1,i+2*s-1);//合并[i,i+s-1],[i+s,i+s*2-1]
i=i+2*s;
}
if(i<n-s)
{
merge_detail(a,b,i,i+s-1,n-1);
}
else
{
for(int j=i;j<n;j++)
{
b[j]=a[j];
}
}
}
void merge_detail(int a[],int b[],int l,int m,int r)//将两段合并到b数组
{
int i=l,j=m+1,k=l;
while(i<=m&&j<=r)
{
if(a[i]<=a[j])
{
b[k++]=a[i++];
}
else
{
b[k++]=a[j++];
}
}
if(i>m)
{
for(int q=j;q<=r;q++)
{
b[k++]=a[q];
}
}
else
{
for(int q=i;q<=r;q++)
{
b[k++]=a[q];
}
}
}
int main()
{
int a[10]={2,5,45,9,3,1,6,78,9,4};
mergesort(a,10);
}
2994

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



