归并排序

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

分治模式有三个步骤:

分解(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);

    }

}

 

你可能感兴趣的:(归并排序)