用分治法递归实现数组排序

#include<iostream>
using namespace std;

const int MAX=100000;

const int LEN=100;

//按从小到大的排列合并数组A,其中A的p~q和q+1~r部分是已经排好序的
int merge(int A[LEN],int p,int q,int r)//p,q,r是数组下标
{
    int n1=q-p+1;
    int n2=r-q;
    int L[LEN],R[LEN];//设置一个左右数组
    for(int i=0;i<n1;i++)//将A的p~q部分赋给左数组
         L[i]=A[p+i];
    for(i=0;i<n2;i++)//将A的q+1~r部分赋给右数组
         R[i]=A[q+1+i];
    L[n1]=MAX; //在左右数组设置一个哨兵
    R[n2]=MAX;
    int j=0;
    for(int k=p;k<=r;k++)//开始合并
    {
        if(L[i]<R[j]) //将左右数组中较小的数赋给A
       {

            A[k]=L[i];

            i++;

       }
       else
       {
            A[k]=R[j];
            j++;
       }
    }
    return 0;

}

//用合并算法递归地排列数组A
int merge_sort(int A[LEN],int p,int r)
{
    int q=0;
    if(p<r)
   {
       q=(p+r)/2;
       merge_sort(A,p,q); //排列A的p~q部分
       merge_sort(A,q+1,r); //排列A的q+1~r部分
       merge(A,p,q,r); //合并A的已排好序的两部分
   }

   return 0;
}

int main()
{
    int A[LEN];
    int n;
    cout<<"please input the length of A:"<<endl;
    cin>>n;
    cout<<"input A:"<<endl;
    for(int i=0;i<n;i++)
    cin>>A[i];
    merge_sort(A,0,n-1); //用分治法排序A
    for(i=0;i<n;i++)
    cout<<A[i]<<" ";
    cout<<endl;
    return 0;
}

posted @ 2013-03-02 19:51  MinZhang  阅读(365)  评论(0编辑  收藏  举报