归并排序——2-路归并排序
1、算法思路:将两个或者两个以上的有序表合成一个新的有序表;
2、时间复杂度O(nlogn) ,空间复杂度O(n) , 稳定的
3、程序需要注意的问题:
MSort需要用到O(n)的额外空间, 需要另设置一个相同的结构,递归实现
void MSort(int *l, int* h,int m, int n){
int p[20]; //需要定义额外的空间O(n)
if(m==n) l[m]=h[m];
else{
int s=(m+n)/2;
MSort(l,p,m,s);
MSort(l,p,s+1,n);
Merge(p,h,m,s,n);
}
}
#include <iostream>
using namespace std;
void Merge(int *l,int *h,int i,int m,int n)
{
int j,k;
for(j=m+1,k=i;j<=n&&i<=m;k++)
{
if(l[i]<l[j]) h[k]=l[i++];
else h[k]=l[j++];
}
while(i<=m)
h[k++]=l[i++];
while(j<=n)
h[k++]=l[j++];
}
void MSort(int *l,int *h,int m,int n)
{
int p[20];
if(m==n) h[m]=l[m];
else {
int s=(m+n)/2;
MSort(l,p,m,s);
MSort(l,p,s+1,n);
Merge(p,h,m,s,n);
}
}
int main()
{
cout<<"输入待排序列大小"<<endl;
int m=0;
cin>>m;
cout<<"输入待排序列元素"<<endl;
int l[100];
for(int i=1;i<=m;i++)
{
cin>>l[i];
}
cout<<"输出未排序的序列元素"<<endl;
for(int i=1;i<=m;i++)
{
cout<<l[i]<<endl;
}
MSort(l,l,1,m);
cout<<"输出有序序列元素"<<endl;
for(int i=1;i<=m;i++)
{
cout<<l[i]<<endl;
}
return 0;
}
解法二:
空间复杂度O(1);借鉴插入排序的思想;
序列分为前后两个有序的子序列,将两个子序列合成一个有序序列
#include <iostream>
using namespace std;
void MergeSort(int arry[],int len)
{
int left=0;
int mid=len/2;
int right=mid;
while(left<mid&&right<len)
{
if(arry[left]<arry[mid])
left++;
else if(arry[left]>arry[mid])
{
while(arry[right]<arry[left])
right++;
int temp=arry[left];
arry[left]=arry[mid];
for(int i=mid+1;i<right;i++)
{
arry[i-1]=arry[i];
}
arry[right-1]=temp;
}
}
}
int main()
{
cout<<"输入待排序列大小"<<endl;
int m=0;
cin>>m;
cout<<"输入待排序列元素"<<endl;
int l[100];
for(int i=0;i<m;i++)
{
cin>>l[i];
}
cout<<"输出未排序的序列元素"<<endl;
for(int i=0;i<m;i++)
{
cout<<l[i]<<endl;
}
MergeSort(l,m);
cout<<"输出有序序列元素"<<endl;
for(int i=0;i<m;i++)
{
cout<<l[i]<<endl;
}
return 0;
}