二分归并排序

1.     问题

二分归并排序:对n个不同的数构成的数组A[1….n]进行排序,其中n=2^k.

2.     解析

二分归并排序:

       将一个数组分割,分割成两个部分,递归分割下去,直到剩余数组元素个数不满足分割条件,就将分割的数组进行排序,然后在递归上去,将分割的序列形成的有序数组进行合并,最后形成一个有序的数组。具体例子如下图:

      

3.     设计

递归分组函数:

           int MergeSort(int A[],int l,int r){

               if(l<r){

                   mid=(l+r)/2;

                   MergeSort(A,l,mid);

                    MergeSort(A,mid+1,r);

                   Merge(A,l,mid,r);

               }

           }

 

合并函数

       void Merge(int A[], int l, int mid, int r)

{

              int *L, *R,x,y;

              x=mid-l+1,y=r-mid;

              L = (int*)malloc(sizeof(int)*x);

              R = (int*)malloc(sizeof(int)*y);

              int i ,j;

              for (i=0; i <x; i++)

                     L[i] = A[i +l];

              for (j=0; j < y; j++)

                     R[j] = A[j + mid + 1];

              i = j = 0;

              int k = l;

              while (i <x && j <y)

              {

                     if (L[i] <= R[j])

                            A[k++] = L[i++];

                     else

                            A[k++] = R[j++];

              }

              while (i < x)

                     A[k++] = L[i++];

              while (j <y)

                     A[k++] = R[j++];

              free(L);

              free(R);

}

4.     分析

 

5.     源码

kitalekita/二分归并.cpp at main · kitalekita/kitalekita (github.com)  

posted @ 2021-03-29 15:06  kitalekita  阅读(382)  评论(0编辑  收藏  举报