C++模板实现归并排序

归并排序的思想是将一个大的序列先进行二分法划分,直到划分到每个子序列只包含一个元素为止. 然后对序列进行依次合并,在合并的过程中实现排序.归并排序是一种典型的外部排序算法,需要额外的辅助空间来完成算法.

算法分析:
1.稳定
2.时间复杂度: O(nlog(n))
3.需要额外辅助空间来实现排序

//Mergesort
//1. Stable
//2. Time complex O(nlog(n))
//3. Need addition space's help (tempArray)
//4. In one time merge sort, when low>=high, stop
template <typename T, unsigned int size>
void Sort<T, size>::mergeSort(T* const sortArray, int low, int high)
{
    if (low >= high)
    {

    }
    else
    {
        int mid = (low + high) / 2;
        mergeSort(sortArray, low, mid);
        mergeSort(sortArray, mid + 1, high);
        merge(sortArray, low, high);
    }
    return;
}


template <typename T, unsigned int size>
void Sort<T, size>::merge(T* const sortArray, int low, int high)
{
    T* tempArray = new T[high-low+1];
    int mid = (low + high) / 2;
    int i = low;
    int j = mid + 1;
    int tempArrayIndex = 0;
    while ((i <= mid) && (j <= high))
    {
        loopTimes++;
        if (sortArray[i] <= sortArray[j])
        {
            tempArray[tempArrayIndex] = sortArray[i];
            i++;
            tempArrayIndex++;
        }
        else
        {
            tempArray[tempArrayIndex] = sortArray[j];
            j++;
            tempArrayIndex++;
        }
    }

    if (i > mid)
    {
        while (j <= high)
        {
            loopTimes++;
            tempArray[tempArrayIndex] = sortArray[j];
            j++;
            tempArrayIndex++;
        }
    }
    else if (j > high)
    {
        while (i <= mid)
        {
            loopTimes++;
            tempArray[tempArrayIndex] = sortArray[i];
            i++;
            tempArrayIndex++;
        }
    }

    //tempArrayIndex = 0;
    //for (int i = low; i <= high; i++)
    //{
    //  sortArray[i] = tempArray[tempArrayIndex];
    //  tempArrayIndex++;
    //}

    memset(&sortArray[low], 0, sizeof(T) * (high-low+1));
    memcpy(&sortArray[low], tempArray, sizeof(T) * (high-low+1));
    delete[] tempArray;
    tempArray = NULL;
    return;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值