归并排序采用的是分而治之的思想。

分治模式有三个步骤:

分解(divide):把原问题分解为一系列子问题

解决(conquer):递归(recursive)地求解各子问题。若子问题足够小,则直接求解。

合并(combine):将子问题的结果合并成原问题的解。

二路归并排序的思路就是把序列分解成子序列,再递归使用合并排序法合并成一个有序序列。

 

void merge(int a[],int p,int q,int r)
{
    int i,j;
    int n1,n2,k;
    n1 = q-p+1;
    n2 = r-q;
    int *left,*right;
    left = (int*) malloc(n1*(sizeof(int)));
    right = (int*)malloc(n2*(sizeof(int)));
    for(i = 0,k = p;i<n1;i++,k++)
    {
        left[i] = a[k];
    }
    for(i = 0,k = q+1;i<n2;i++,k++)
    {
        right[i] = a[k];
    }
    for(i = 0,j = 0,k = p;i<n1&&j<n2;k++)
    {
        if(left[i]<right[j])
        {
            a[k] = left[i];
            i++;
        }
        else
        {
            a[k] = right[j];
            j++;
        }
    }
   if(i<n1)
    {
        for(int t = i;t<n1;t++,k++)
            a[k] = left[t];
    }
    if(j<n2)
    {
        for(int t = j;t<n2;t++,k++)
            a[k] = right[t];
    }
  
}
void mergsort(int a[],int start,int end)
{
    if(start<end)
    {
        int h = (start+end)/2;
        mergsort(a, start, h);
        mergsort(a, h+1, end);
        merge(a, start, h, end);
    }
}

 

 posted on 2014-05-23 21:46  Clivia_zhou  阅读(249)  评论(0编辑  收藏  举报