归并排序递归思想

时间:2020-04-21
本文章向大家介绍归并排序递归思想,主要包括归并排序递归思想使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

归并排序基于递归的思想,递归将一个数组分别等量的两个数组,最后再根据大小顺序插入help数组中保证help数组是有序的,将数组赋值到原数组。此方法基于分而治之的思想。根据Master公式:

T [n] = aT[n/b] + f (n)(直接记为T [n] = aT[n/b] + T (N^d))

其中 a >= 1 and b > 1 是常量,其表示的意义是n表示问题的规模,a表示递归的次数也就是生成的子问题数,b表示每次递归是原来的1/b之一个规模,f(n)表示分解和合并所要花费的时间之和。

解法:
①当d<logb a时,时间复杂度为O(n^(logb a))
②当d=logb a时,时间复杂度为O((n^d)*logn)
③当d>logb a时,时间复杂度为O(n^d)
可以知道显然归并排序的时间复杂度是O(nlogn),格外空间O(n);

void Mergesort(int* &arr,int l,int r);
void Merge(int* &arr,int l,int mid,int r);

void MergeSort(int* &arr,int n)
{
    if( arr == NULL|| n<=1 ) return ;

    Mergesort(arr,0,n-1);
}

void Mergesort(int* &arr,int l,int r)
{
    if(l==r) return;
    //printArr(arr,r);
    // int mid= l + ((r-l) >> 1);
    int mid= (l + r)/2;
    
    Mergesort(arr,l,mid);
    Mergesort(arr,mid+1,r);
    Merge(arr,l,mid,r);
}
 
// 1   4    9 ||  3    5    6
// l      mid     mid+1

void Merge(int* &arr,int l,int mid,int r)
{
    
    int *help=(int *)malloc(sizeof(int)*(r-l+1));
    int i=0;
    int p1=l;
    int p2=mid+1;
    while(p1<=mid && p2<=r)
    {
        help[i++] =    arr[p1]    <=    arr[p2]    ? arr[p1++] : arr[p2++];
    }
    while(p1<=mid)
    {
        help[i++] = arr[p1++];
    }
    while(p2<=r)
    {
        help[i++] = arr[p2++];
    }
    for(i=l;i<=r;i++)
    {
        arr[i]=help[i-l];
    }
}

原文地址:https://www.cnblogs.com/RainzzZ/p/12743810.html