二路遞歸式歸併排序(基本上分爲兩個版本,此篇爲其中一個版本):
舉例:對下面的七個數歸併排序
1, 5, 1, 7, 11, 10, 9
程序按照下圖運行。
程序中需要注意的幾個關鍵語句:
merge(b,a,begin,end,mid);//傳過去的順序是b,a,
而函數merge(int* a,int* b,int begin,int end,int mid)
因爲: mergesort中的if語句
if(begin==end)
{
b[begin]=a[begin];
}
b中存的是要進行排序的數int k=i;//在函數merge( )中
for(int l=0;l<7;l++)//merge( )中
a[l]=b[l];
1. 分,mergesort(a,b,begin,mid);
mergesort(a,b,mid+1,end);
2. 治(排序、合併) merge(b,a,begin,end,mid);
# include< iostream>
using namespace std;
void merge(int* a,int* b,int begin,int end,int mid)
{
int i=begin;
int j=mid+1;
int k=i;
while(i<=mid&&j<=end)
{
if(a[i]<a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
if(j<=end)
{
while(j<=end)
b[k++]=a[j++];
}
else
{
while(i<=mid)
b[k++]=a[i++];
}
for(int l=0;l<7;l++)
a[l]=b[l];
}
void mergesort(int* a,int *b,int begin,int end)
{
if(begin==end)
{
b[begin]=a[begin];
}
else
{
int mid=(begin+end)/2;
mergesort(a,b,begin,mid);
mergesort(a,b,mid+1,end);
merge(b,a,begin,end,mid);
}
}
int main( )
{
int a[7]={1,5,1,7,9,10,11};
int b[7];
mergesort(a,b,0,6);
for(int i=0;i<7;++i)
{
cout<<b[i]<<",";
}
return 0;
}