算法分析与设计实践作业4

1.     问题

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

 

2.     解析

二分归并排序采用分治法的思想,将数组先划分再排序。先把这个要排序的数组划分为两份,然后再把子数组再次二分,直到数组的大小为1;然后从最底端开始向上合并,合并的过程对每一个子数组进行排序。下面以数组{50,61,49,38,53,65,10,36}为例:

 

 

 

3.     设计

void MergeSort(first,last){//划分

        int middle;

        if(first<last){

          middle=(first+last)/2;

          MergeSort(first,middle);

          MergeSort(middle+1,last);

          Merge(first,middle,last);

    }

}

 

Merge(first,middle,last){

        int i=first;

        int j=middle+1;

        int p=first;

        while(i<=middle && j<=last){

                 if(a[i]>a[j])

                   newA[p++]=a[j++];

                 else

                   newA[p++]=a[i++];

        }

        while(i!=middle+1)

          newA[p++]=a[i++];

        while(j!=last+1)

           newA[p++]=a[j++];

        for(int b=first;b<=last;b++)

           a[b]=newA[b];

}

 

 

 

4.     分析

算法复杂度:O(nlog2(n))

 

 

 

5.     源码

github地址:https://github.com/122cmy/myGitTemp4

博客地址:https://www.cnblogs.com/122cmy/

posted @ 2021-04-12 16:00  小月爱写代码  阅读(39)  评论(0)    收藏  举报