合并排序

合并排序

  1. 算法思想

对于输入的数组a[i , j],将其分为大致相同的2个子集,利用递归一直分下去,然后分别对2个子集进行排序(在合并中体现),最终完成排序。

  2. 算法实现

template<class T>
void Copy(T a[], T b[], int left, int right)
{
    for(int i = left; i <= right; i++){
        a[i] = b[i];
    }
} 

template<class T>
void Merge(T a[], T b[], int left, int middle, int right)
{
    int r = middle + 1, k = left;
    while( (left <= middle) && (r <= right) ){
        if(a[left] <= a[r])  b[k++] = a[left++];
        else b[k++] = a[r++];
    }
    while(left <= middle) b[k++] = a[left++];
    while(r <= right) b[k++] = a[r++];
}

template<class T>
void MergeSort(T a[], T b[], int left, int right)
{
    if(left < right){
        int temp = ( (left + right) / 2);
        MergeSort(a,b,left, temp);
        MergeSort(a,b,temp + 1,right);
        Merge(a,b,left,temp,right);
        Copy(a,b,left,right); 
    }
}

3. 算法分析

在Merge排序中,其时间复杂度与输入数组是否有序无关,最坏时间复杂度和平均时间复杂度均为Ο(nlog(n)),其空间复杂度为Ο(n),体现在辅助数组。

posted on 2016-10-07 21:07  JackTheRipper  阅读(217)  评论(0)    收藏  举报

导航