二路归并排序是归并排序中最简单的一种,其算法思想是假设有两个有序的序列,然后将这里两个序列合并为一个序列,只要找这两个序列中较小的元素即可,最后把剩下的元素复制出来。
void mergearray(int a[],int first,int mid,int last,int temp[])
{
int i=first,j=mid+1;
int m=mid, n=last;
int k=0;
while(i<=m&&j<=last)
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=m)
temp[k++]=a[i++];
while(j<=n)
temp[k++]=a[j++];
for(i=0;i<k;++i)
a[first+i]=temp[i];
}然后再考虑归并排序,归并排序采用分治法的思想,先将数组分解,然后组内有序,最后再合并。
完整的代码:
#include<iostream>
using namespace std;
void mergearray(int a[],int first,int mid,int last,int temp[])
{
int i=first,j=mid+1;
int m=mid, n=last;
int k=0;
while(i<=m&&j<=last)
{
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=m)
temp[k++]=a[i++];
while(j<=n)
temp[k++]=a[j++];
for(i=0;i<k;++i)
a[first+i]=temp[i];
}
void mergesort(int a[],int first,int last,int temp[])
{
if(first<last)
{
int mid=(first+last)/2;
mergesort(a,first,mid,temp);
mergesort(a,mid+1,last,temp);
mergearray(a,first,mid,last,temp);
}
}
bool MergeSort(int a[],int n)
{
int *p=new int [n];
if(p==NULL)
return false;
mergesort(a,0,n-1,p);
delete []p;
return true;
}
int main(void)
{
int a[10]={0,2,3,4,1,5,6,9,8,7};
MergeSort(a,10);
for(int i=0;i<10;++i)
cout<<a[i]<<" ";
return 0;
}

4220

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



