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;
}
【资源目录】:【单片机-毕业设计】 平面电容传感器模型特性研究.docx【单片机-毕业设计】 平面电容传感器模型特性研究.docx【单片机-毕业设计】AutoCAD实体零件库(轴系)的建立.docx【单片机-毕业设计】HDL电子琴设计.docx【单片机-毕业设计】LED电子日历设计.docx【单片机-毕业设计】VHDL倍频器.docx【单片机-毕业设计】VHDL条形码识别器设计.docx【单片机-毕业设计】VHDL正弦信号发生器设计.docx【单片机-毕业设计】VHDL频率计设计.docx【单片机-毕业设计】《电动车无线防盗报警器设计》.docx【单片机-毕业设计】三十二路彩灯控制器设计.docx【单片机-毕业设计】二层独位车库的设计.docx【单片机-毕业设计】信号相干电路抗干扰性能分析.docx【单片机-毕业设计】倍频器设计.docx【单片机-毕业设计】具有报警功能的锅炉水位自动控制器.docx【单片机-毕业设计】单片机下载线设计.docx【单片机-毕业设计】单片机对无刷直流电动机的控制电路设计.docx【单片机-毕业设计】单片机电加热炉的温度控制系统.docx【单片机-毕业设计】四位数码管显示电动机转速测量仪.docx【单片机-毕业设计】图像处理在AutoCAD软件中的应用开发研究.docx【单片机-毕业设计】基于2.4GHz射频的无线串口通信设计.docx【单片机-毕业设计】基于AVR单片机的LED自适应调光.docx【单片机-毕业设计】基于DS18B20的高精度温度显示设计.docx【单片机-毕业设计】基于FPGA的变频电路设计.docx【单片机-毕业设计】基于IC卡的楼宇门禁系统设计.docx【单片机-毕业设计】基于STM32的电子秤.docx.............
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值