歸併排序

二路遞歸式歸併排序(基本上分爲兩個版本,此篇爲其中一個版本):
舉例:對下面的七個數歸併排序
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;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章