当前位置: 首页 > news >正文

【手撕排序3】归并排序

在这里插入图片描述
🍃 本系列包括常见的各种排序算法,如果感兴趣,欢迎订阅🚩
🎊个人主页:小编的个人主页
🎀 🎉欢迎大家点赞👍收藏⭐文章
✌️ 🤞 🤟 🤘 🤙 👈 👉 👆 🖕 👇 ☝️ 👍

目录

  • 🐼前言
  • 🐼归并排序
  • 🐼文末

🐼前言

🌟在上一节我们实现了快速排序,感受到了快速排序的魅力,如果感兴趣的小伙伴,可以阅读我的上一篇文章:> 快速排序,这节小编将带领大家感受归并排序的美学。

🐼归并排序

🔍归并排序采用分治的思想,将一组乱序的数字先二分,再二分,直到不能二分,此时每个子序列有序。再使子序列段间有序直到得到一个完全有序的子序列。再将得到的子序列合并成一个有序表。
如图:
在这里插入图片描述
🔍我们先取中间值mid二分,划分左右两个序列([left,mid],[mid+1,right])直到划分为一个元素,那么该元素就是有序的。
🔍在进行合并,将划分的两个有序数组进行合并。
总结来说,递归进行分解,回溯进行合并
归并排序代码:

void _MergeSort(int* arr,int left,int right,int* tmp)
{if (left >= right){return;}//二分int mid = left + (right - left) / 2;//根据Mid划分为两个序列 [left,mid] [mid+1,right]_MergeSort(arr, left, mid,tmp);_MergeSort(arr, mid + 1, right,tmp);//合并两个有序数组[left,mid] [mid+1,right]int begin1 = left, end1 = mid;int begin2 = mid + 1, end2 = right;int index = begin1;//从begin1开始while (begin1 <= end1 && begin2 <= end2){if (arr[begin1] < arr[begin2]){tmp[index++] = arr[begin1++];}else{tmp[index++] = arr[begin2++];}}//[left,mid]还有元素while (begin1 <= end1){tmp[index++] = arr[begin1++];}//[mid + 1, right]还有元素while (begin2 <= end2){tmp[index++] = arr[begin2++];}//将新数组拷贝到原数组for (int i = left; i <= right; i++){arr[i] = tmp[i];}
}
//归并排序
void MergeSort(int* arr, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(arr, 0, n - 1,tmp);free(tmp);tmp = NULL;
}

🔍为了不在原来的数组上进行合并,我们创建了一个临时数组来保存合并好的有序序列,最后,将新数组拷贝到原数组。
归并排序性能分析:

递归深度为O(logn),合并两个有序序列为O(N),所以,归并排序的时间复杂度为O(n*logn).空间复杂度为O(N);

🍀测试结果:
排序数组:{ 4,6,7,2,1,8,9,5,3 ,0 }在这里插入图片描述

🐼文末

感谢你看到这里,如果觉得本篇文章对你有帮助,点个赞👍 吧,你的点赞就是我更新的最大动力 ⛅️🌈 ☀️


http://www.mrgr.cn/news/68783.html

相关文章:

  • 【开源项目】经典开源项目数字孪生智慧小镇——开源工程及源码
  • Aop+自定义注解实现数据字典映射
  • 【客观理性深入讨论国产中间件及数据库-科创基础软件】
  • JVM基本结构
  • Java | Leetcode Java题解之第538题把二叉搜索树转换为累加树
  • 【dvwa靶场:XSS系列】XSS (Stored)低-中-高级别,通关啦
  • 详解Windows 11 上 CUDA 与 PyTorch 版本的兼容性
  • 谷歌新政,照片和视频访问权限新规?声明表单怎么写更容易通过审核?
  • Linux常用的100个命令
  • 【算法|字符串、哈希表】验证回文串、螺旋塔、同构字符串、单词规律
  • 跟我学C++中级篇——生产中如何调试程序
  • 深度学习:微调(Fine-tuning)详解
  • MySQ怎么使用语法介绍(详细)
  • 深失速现象
  • 穿销程序之如何写停止程序
  • Vue3入门介绍及快速上手
  • 【傻呱呱】phpMyAdmin怎样给特定用户授权特定数据库权限?
  • 迅捷pdf转换器pk这9款,哪款是你的菜??
  • 盘点2024年10款视频剪辑,哪款值得pick!!
  • 数仓工具—Hive语法之窗口函数窗口范围/边界 range between和rows between
  • 面试官说:不懂Python装饰器的人直接Pass!!
  • 【vue2.0入门】vue单文件组件
  • 多线程案例---阻塞队列
  • 国内 ChatGPT中文版镜像网站整理合集(2024/11/08)
  • idea 基础简单应用(java)
  • Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin