简述归并排序

归并排序

特点:

  • 高效
  • 稳定
  • 时间复杂度最佳/平均/最差: O(N log N)

    递归算法有专门的公式来计算时间复杂度

  • 空间复杂度 O(N)

    因为开辟了临时的tem_arr数组

一个静态的演示图(from leetcode)

在这里插入图片描述

一个动态的演示图

在这里插入图片描述

合并实现使用merge函数

inline void merge(vector<int>& arr, int l, int r) {
vector<int> tem_arr;
int m = (l + r) >> 1;
//1 2 3 4 2 4 5 8
//0 1 2 3 4 5 6 7
//l m r
//i j
int i = l, j = m+1;
while (i <= m && j <= r) {
if (arr[i] <= arr[j]) tem_arr.push_back(arr[i++]);
else tem_arr.push_back(arr[j++]);
}
while (i <= m) tem_arr.push_back(arr[i++]);
while (j <= r) tem_arr.push_back(arr[j++]);
int k = l;
for (auto n : tem_arr) {
arr[k++] = n;
}
}

mergeSort 函数

  • 利用merge()方法来进行合并
  • 体现了分而治之的算法思想
  • 需要掌握递归的思维
inline void mergeSort(vector<int>& arr, int l, int r) {
if (l == r) return; //如果边界重合返回
int m = (l + r) >> 1; //定义一个中点
mergeSort(arr, l, m); //将问题分成左边部分
mergeSort(arr, m+1, r); //将问题分成右边部分
merge(arr, l, r); //调用merge()来进行合并
}

完整代码

#include <iostream>
#include <vector>
#define test_merge
using namespace std;
inline void merge(vector<int>& arr, int l, int r);
inline void mergeSort(vector<int>& arr, int l, int r) {
if (l == r) return;
int m = (l + r) >> 1;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, r);
}
inline void merge(vector<int>& arr, int l, int r) {
vector<int> tem_arr;
int m = (l + r) >> 1;
//1 2 3 4 2 4 5 8
//0 1 2 3 4 5 6 7
//l m r
//i j
int i = l, j = m+1;
while (i <= m && j <= r) {
if (arr[i] <= arr[j]) tem_arr.push_back(arr[i++]);
else tem_arr.push_back(arr[j++]);
}
while (i <= m) tem_arr.push_back(arr[i++]);
while (j <= r) tem_arr.push_back(arr[j++]);
int k = l;
for (auto n : tem_arr) {
arr[k++] = n;
}
}
int main() {
ios::sync_with_stdio(false);//加速出入输出流
#ifdef test_merge
// 测试 merge 函数是否起作用
vector<int> arr = {7, 3, 2, 6, 0, 1, 5, 4};
mergeSort(arr, 0, arr.size() - 1);
for (auto i : arr) {
cout << i << ' ';
}
#endif
}
posted @   IoOozZzz  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示