数据结构基础(5) --归并排序

简介: 归并排序的基本思想:    将两个或两个以上的有序子序列”归并”为一个有序序列:假定待排序表含有n个记录, 则可以看成是n个有序的子表, 每个子表长度为1, 然后两两归并, 得到[n/2]个长度为2或1的有序表,; 再量量归并, .

归并排序的基本思想:

    将两个或两个以上的有序子序列”归并”为一个有序序列:假定待排序表含有n个记录, 则可以看成是n个有序的子表, 每个子表长度为1, 然后两两归并, 得到[n/2]个长度为2或1的有序表,; 再量量归并, ...., 如此重复, 直到合并成为一个长度为n的有序表为止, 这种排序方法称为2-路归并排序.如图为一个2-路归并排序的一个示例:


/**说明:
	将有序的记录序列 initList[left:mid] 和 initList[mid+1:right]归并为有序的记录序列 initList[left:right]
    initList:  原始的有序序列[分为两段]
    tmpList: 	 合并过程中需要的中间序列
    left:       initList最左边元素的下标
    mid:        指向第一个有序序列的最后一个元素的下标
    right:      initList最右边元素的下标
*/
template <typename Type>
int Merge(Type *initList, Type *tmpList, int left, int mid, int right)
{
    //先将待归并的数组复制到tmpList中去
    std::copy(initList+left, initList+right+1, tmpList+left);
//    同下:
//    for (int i = left; i <= right; ++i)
//    {
//        tmpList[i] = initList[i];
//    }

    int s1 = left, s2 = mid+1;
    int iResult = left;
    while (s1 <= mid && s2 <= right)
    {
        if (tmpList[s1] <= tmpList[s2])
        {
            initList[iResult ++] = tmpList[s1 ++];
        }
        else
        {
            initList[iResult ++] = tmpList[s2 ++];
        }
    }

    int *end;
    if (s1 <= mid)
        end = std::copy(tmpList+s1, tmpList+mid+1, initList+iResult);
    if (s2 <= right)
        end = std::copy(tmpList+s2, tmpList+right+1, initList+iResult);
    return end - (initList+left);

//    同下:其实这两个循环只有一个会执行
//    while (s1 <= mid)
//    {
//        initList[iResult ++] = tmpList[s1 ++];
//    }
//    while (s2 <= right)
//    {
//        initList[iResult ++] = tmpList[s2 ++];
//    }
//
//    return iResult;
}
//二路归并排序-递归算法
template <typename Type>
void mergeSort(Type *initList, Type *tmpList, int left, int right)
{
    if (left >= right)
        return;

    int mid = (left+right)/2;
    mergeSort(initList, tmpList, left, mid);    //先将左边元素排序
    mergeSort(initList, tmpList, mid+1, right); //后将右边元素排序
    Merge(initList, tmpList, left, mid, right); //合并
}

可以看出对n个记录进行归并排序的时间复杂度为Ο(nlogn)。即:

    (1)每一趟归并(合并)的时间复杂度为 O(n);

    (2)总共需进行[logn]趟。

目录
相关文章
|
2月前
|
搜索推荐 C语言
数据结构(C语言)之对归并排序的介绍与理解
归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
|
2月前
|
存储 人工智能 算法
【C++数据结构——内排序】二路归并排序(头歌实践教学平台习题)【合集】
本关任务是实现二路归并算法,即将两个有序数组合并为一个有序数组。主要内容包括: - **任务描述**:实现二路归并算法。 - **相关知识**: - 二路归并算法的基本概念。 - 算法步骤:通过比较两个有序数组的元素,依次将较小的元素放入新数组中。 - 代码示例(以 C++ 为例)。 - 时间复杂度为 O(m+n),空间复杂度为 O(m+n)。 - **测试说明**:平台会对你编写的代码进行测试,提供输入和输出示例。 - **通关代码**:提供了完整的 C++ 实现代码。 - **测试结果**:展示代码运行后的排序结果。 开始你的任务吧,祝你成功!
44 10
|
7月前
|
存储 搜索推荐 算法
【初阶数据结构篇】归并排序和计数排序(总结篇)
归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divide andConquer)的⼀个⾮常典型的应⽤。
83 0
|
5月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
93 1
|
5月前
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
【初阶数据结构】打破递归束缚:掌握非递归版快速排序与归并排序
|
5月前
|
算法
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
蓝桥杯宝藏排序 | 数据结构 | 快速排序 归并排序
|
9月前
|
算法
数据结构与算法-归并排序
数据结构与算法-归并排序
43 2
|
9月前
|
搜索推荐
深入理解数据结构第六弹——排序(3)——归并排序
深入理解数据结构第六弹——排序(3)——归并排序
64 1
|
9月前
|
存储 算法 搜索推荐
【数据结构】归并排序的非递归写法和计数排序
【数据结构】归并排序的非递归写法和计数排序
|
10月前
|
存储 搜索推荐 算法
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)
[数据结构]————排序总结——插入排序(直接排序和希尔排序)—选择排序(选择排序和堆排序)-交换排序(冒泡排序和快速排序)—归并排序(归并排序)