【递归版】归并排序算法(1)

简介: 【递归版】归并排序算法(1)



MergeSort归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并排序核心步骤:分解+合并

归并排序的特性总结:

1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考是解决在磁盘中的外排序问题。
2. 时间复杂度:O(N*logN)
3. 空间复杂度:O(N)
4. 稳定性:稳定

对于两端有序序列的合并,在顺序表和链表的OJ题目都学习过了。


整体思想

整体思想

  • 分治的思想(分而治之)分治的思想一般都用递归的方式去完成。
  • 两个有序序列合并任然是有序序列
  • 一段无序序列>>>>>>有序
  • 无序序列一直【递推】分割分割直到一个元素(一个元素肯定有序)
  • 再【回归】的时候合并即可
  • 递归的两部分:子问题&结束条件

整个流程

  • 开辟一个tmp新的数组在外部(不可能每次递归都开辟一个新的数组)
  • 开始分解[begin,mid] [mid+1,end]
  • 分解到不能在分解了(只有一个元素肯定是顺序序列)回归begin = end
  • 合并
  • 两个有序序列数组和链表合并,依旧有序(取小值尾插)
  • 有序序列合并(归并有序序列)
  1. 利用开辟一个tmp新的数组(不能放到MergeSort函数里面,不可能每次递归都开辟一个新的数组)
  2. 选小的尾插直到至少序列begin > end
  3. 若还有序列存在元素直接尾插到tmp后面
  • 拷贝到a数组
  • 最后记住释放free(tmp)❗

重点突破

  • 递归的分解
  • 有序序列的合并
  • tmp数组的开辟

易错点突破

  • 有序序列的合并(&&)
  • 拷贝的起始位置
  • 下标和元素个数和区间问题

图解分析

代码实现

void _MergeSort(int* a, int* tmp,int begin, int end)
{
  if (begin >= end)
  {
    return;
  }
  //分割
  int mid = (begin + end) / 2;
  //[begin,mid] [mid+1 ,end]
  _MergeSort(a, tmp, begin, mid);
  _MergeSort(a, tmp, mid + 1, end);
  //合并
  int begin1 = begin;
  int end1 = mid;
  int begin2 = mid + 1;
  int end2 = end;
  int i = begin;
  //int i = 0;
  while (begin1 <= end1 && begin2 <= end2)
  {
    if (a[begin1] < a[begin2])
    {
      tmp[i++] = a[begin1++];
    }
    else//>
    {
      tmp[i++] = a[begin2++];
    }
  }
  while (begin1 <= end1)//
  {
    tmp[i++] = a[begin1++];
  }
  while (begin2 <= end2)
  {
    tmp[i++] = a[begin2++];
  }
  //合并完成拷贝
  //memcpy(a + begin, tmp, (end - begin + 1) * sizeof(int));
  memcpy(a + begin, tmp+begin, (end - begin + 1) * sizeof(int));
}
void MergeSort(int* a, int n)
{
  int* tmp = (int*)malloc(sizeof(int) * n);
  if (tmp == NULL)
  {
    perror("malloc fail");
    return;
  }
  _MergeSort(a, tmp, 0, n - 1);
  free(tmp);
}

时间复杂度

时间复杂度O(N*logN)

递归&归并排序VS快速排序

  • 快速排序的递归:前序递归
  • 归并排序的递归 :后序递归

🙂感谢大家的阅读,若有错误和不足,欢迎指正。

目录
相关文章
|
1月前
|
机器学习/深度学习 数据采集 监控
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
机器学习-特征选择:如何使用递归特征消除算法自动筛选出最优特征?
71 0
|
1月前
|
存储 缓存 算法
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
|
14天前
|
算法
算法系列--递归(一)--与链表有关(上)
算法系列--递归(一)--与链表有关
27 0
|
18天前
|
存储 算法 搜索推荐
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
【数据结构与算法】归并排序(详解:递归与非递归的归并排序 | 赠:冒泡排序和选择排序)
|
27天前
|
搜索推荐 算法
【数据结构】八大排序之归并排序算法
【数据结构】八大排序之归并排序算法
21 5
|
1月前
|
存储 编解码 自然语言处理
【软件设计师备考 专题 】深入理解数据压缩、递归和图的相关算法
【软件设计师备考 专题 】深入理解数据压缩、递归和图的相关算法
64 0
|
1月前
|
机器学习/深度学习 算法 搜索推荐
数据结构与算法(Java篇)笔记--归并排序
数据结构与算法(Java篇)笔记--归并排序
|
1月前
|
算法 Java 定位技术
【数据结构与算法】递归、回溯、八皇后 一文打尽!
【数据结构与算法】递归、回溯、八皇后 一文打尽!
|
1月前
|
存储 算法 C语言
【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫
【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。