C++ 之归并排序模板

C++模板归并排序 C++模板实现归并排序 阅读详情

C++ 之归并排序模板

描述: 归并排序其实是分治的思想。先数组多次分成左边区间和右边区间,直到每个区间只有一个元素的时候开始将左区间和右区间合并(排序的过程在合并中),直到恢复成原来的数组。

#include <iostream>
#include <vector>
using namespace std;

// 合并(排序函数)
void mergeSort(vector<int>& nums, int left, int mid, int right) {

	vector<int> tmp(right - left + 1);  //用来存储本轮已经排序好的数组

	int i = left, j = mid + 1;  // i是左端数组的起点,j是右端数组的起点
	int index = 0;

	while (i <= mid && j <= right) {
		if (nums[i] < nums[j]) {
			tmp[index++] = nums[i++];
		}
		else {
			tmp[index++] = nums[j++];
		}
	}

	// 可能左端数组还有剩下的数字
	while (i <= mid) tmp[index++] = nums[i++];
	// 可能右端数组还有剩下的数字
	while (j <= right) tmp[index++] = nums[j++];

	// tmp是排序好的数组,将tmp的内容拷贝到原始数组nums中
	index = 0;
	for (int k = left; k <= right; ++k) {
		nums[k] = tmp[index++];
	}
	// 到这里,原始数组nums的下标[left, right]部分已经排序好了
	// 由nums的[left, mid] 和 nums的 [mid + 1, right]部分合并而成,因此合并的过程就是排序的过程
}

void merge(vector<int>& nums, int left, int right) {
	// left = right 的时候说明已经只剩下一个数了,所以不再向下分开成左右数组
	if (left < right) {
		int mid = left + ((right - left) >> 1);
		merge(nums, left, mid);  // 拆分左端数组
		merge(nums, mid + 1, right); //拆分右端数组

		mergeSort(nums, left, mid, right); // 将左右数组合并(在合并的过程排序)
	}
}

int main() {

	vector<int> nums = {1, 4, 5, 5, 8, 9, 3, 2};
	
	merge(nums, 0, nums.size() - 1);
	cout << "排序好的数组为:" << endl;
	for (int n : nums) {
		cout << n << " ";
	}
	return 0;
}


归并排序 C++ 模板 归并排序的使用和理解在于分和治,利用递归我们可以轻松实现 归并排序时间复杂度低,且在分,治过程中可以进行一些变形,用于逆序对求解等问题 #include<iostream> using namespace std; const int maxn=1e5; int tmp[maxn],q[maxn]; void _merge(int l,int r){ if(l==r) return; int mid=(l+r)>>1; _merge(l,mid); _merge(mid+1, 阅读详情

相关推荐

c++模板类实现各种排序算法

头文件: //Sorting.h #ifndef DATALIST_H #define DATALIST_H #include&amp;amp;lt;iostream&amp;amp;gt; using namespace std; const int DefaultSize = 100; template&amp;amp;lt;typename T&amp;amp;gt; class Element { public: T key; //排序码 ...

NockinOnHeavensDoor的博客 1798

C++打卡19-【排序模板】归并排序

题目描述 输入nn个整数,用归并排序算法将这nn个数从小到大进行排序。n \leq 1000n≤1000. 输入格式 第一行,输入整数nn. 第二行,输入这nn个整数 输出格式 一行,按从小到大输出这nn个数 输入样例 10 2 3 4 1 3 6 7 4 9 8 输出样例 1 2 3 3 4 4 6 7 8 9 代码↓ #include <bits/stdc++.h> using namespace std; const int N = 1000010;..

m0_73177250的博客 427

VS2015+C++实战:手把手教你用海康MVS里的Demo搞定多相机同步采图与保存

本文详细解析了在VS2015+C++环境下,利用海康威视MVS工业相机SDK实现多相机同步采图与保存的全流程。从环境准备、SDK选择到多相机初始化、同步采图方案,再到异常处理与性能优化,提供了实战技巧和代码示例,帮助开发者快速掌握工业相机二次开发的核心技术。

weixin_29170327的博客 281

归并排序算法模板c++

归并排序是把数组切分成n个logn的数组进行排序,从两个序列里合并成一个大的,体现的是分治思想。

m0_74161738的博客 524

智能体在车联网中的应用:一份详尽到每日的100天学习路线图

这100天的旅程,是一次对毅力、学习方法和工程实践能力的综合考验。它不仅关乎掌握一系列技术点,更关乎培养解决复杂系统性问题的思维模式——将宏观的交通需求分解为微观的智能体决策,再通过多智能体协同涌现出宏观的智能行为。当你完成这份大纲时,你将拥有的不仅是一个项目作品集,更是一套应对“智能体+车联网”乃至更广泛AI+垂直领域挑战的方法论。未来已来,期待你成为构建智能交通新生态的关键贡献者。

IT深耕十余载,大道之简 1334

当NetApp 7-mode遇到单控制器故障:HA模式手动修复全记录

本文详细记录了NetApp 7-mode存储系统在单控制器故障时的应急修复过程,包括HA配置重建、磁盘初始化和业务恢复等关键步骤。通过实战案例解析如何解决`VIA Interconnect is down`等典型问题,为企业级存储系统的高可用保障提供实用指南。

yolo5detector的博客 247

C++ 归并排序模板

#include<iostream> using namespace std; const int N = 1000010; int n; int q[N], tmp[N]; void merge_sort( int q[], int l, int r) { if(l >= r) return; int mid = l + r >> 1; merge_sort(q, l, mid),merge_sort(q, mid + 1, r); .

ndzyh的博客 979

ACT代码梳理:新手学具身智能,不需要学会一堆理论,先跑起来再说

我是一个刚接触具身智能的小白。第一次看 ACT 项目,什么 Transformer、VAE、Mujoco、rollout,全是天书。但我没打算先把理论补完。太难,也太慢。我的策略是:直接上手,边做边学,卡在哪就学到哪。这篇文章是我的第一站——带你一起看懂 ACT 项目的整体架构,了解它的核心模块和流程。开始前,我列了 本文出现的18 个关键词,是我一开始完全搞不懂的。你可以先扫一眼,如果不认识的超过 10 个,那我们就是同路人,可以放心往下看了。

qq_17405041的博客 1208

C++实现归并排序(详细代码)

#include<iostream> using namespace std; #define num 10 void merge(int* a, int len); void merge(int* a, int l, int m, int r); //归并排序 //把一个数组拆成两等份 递归 void mergeSort(int * a,int l, int r) { if (l == r) { return; } int m = l ...

m0_53311279的博客 6262

uniapp - 实现手机端H5网页直播功能效果,拿到后端推流地址或播放资源后进行前端的流畅播放和画面展示功能,uniapp实时推流/拉流直播系统详细教程(提供完整示例代码,一键复制开箱即用!)

uniapp,h5网页,手机端H5网页,uniapp h5直播功能页面,uniapp直播实时推送显示,uniapp h5直播怎么做,怎么使用uniapp去实现移动端手机H5直播,h5 vue+uniapp怎么做直播,uniapp中使用videojs构建H5直播播放器,uniappH5端怎么实现直播推流,uniapp如何实现直播,直播聊天功能,h5平台端直播用什么插件,uniapp手机网页直播用什么组件插件播放器,uniapp手机H5直播播放器详细教程,直播项目,怎么使用vue+uniapp怎么做H5实时直播

✅ 精选推荐文章 8792

magic-api的鉴权机制配置 (附实战代码)

引入magic-api及相关数据库驱动依赖 配置yml文件和编辑器JS文件 实现登录鉴权逻辑,包括用户验证和Token处理 接口鉴权拦截器设计,确保接口访问安全性 文章提供了完整的代码示例,帮助开发者快速集成magic-api框架并实现权限控制功能。

码农研究僧的博客 227

归并排序C++实现

一、归并排序MergeSort 归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略,分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。归并排序的时间复杂度为nlog2n。 二、图解 下面用一张图了解用分治法实现归并排序的过程: 对于每个划分的排序顺序可以看成图的后序遍历 可以看到,我们将原序列不断进行二分,直至只有一个元素,得到n个只含有一个元素的序列,再将这n个需序列不断地两两合并,最终得到一个有序的序列。 这个过程中,合并是实现排序的

weixin_54913371的博客 5343

MATLAB基础应用精讲-【数模应用】PPO算法(附python代码实现)(二)

表示为状态转移概率和动作选择概率的乘积,因为状态和动作决定轨迹。

qq_36130719的博客 413

C++归并排序模板

#include using namespace std; template void Merge( T* arr, int low, int mid, int high ) { int i, j, k; i = low; j = mid + 1; k = 0; T* tmp = new T[high - low + 1]; while( i

恨天低 4989

MetaERP 的管理单元在设计哲学和实现逻辑上,确实与 Oracle EBS 的业务实体(OU)一脉相承,你可以放心地在已知的 Oracle 多组织架构框架下进行理解。它并没有推翻这套经典的核算模型

MetaERP的管理单元设计继承了Oracle EBS业务实体(OU)的核心思想,并进行了现代技术重构。管理单元(MU)作为OU的超集,延续了业务数据隔离与流程执行边界的定位,但通过元数据驱动的多租户架构实现更灵活的数据隔离。MetaERP采用三层解耦设计(核算单元、自然科目、核算维度),解决了EBS科目组合爆炸问题,并实现事件驱动的实时核算。相较于EBS的批处理模式,MetaERP通过云原生架构和元数据驱动配置,显著提升了灵活性、实时性和扩展性,支持跨法人的业务统一管理视图。

金牌架构师 576

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

c/c++之模板方法实现归并排序

#include #include #include template void Merge(T sourceArr[],T tempArr[],int startIndex,int midIndex,int endIndex){ int i = startIndex,j=midIndex+1,k = startIndex; while(i!=midIndex+1 && j!=e

云守护的专栏 819

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

c++ 归并排序 - 模板函数写法

归并排序 - 模板函数写法 // merge_sort.cpp #include <iostream> #include <vector> #include "../head_file/template_head.h" using namespace std; void merge_sort() { cout << "Merge Sort!!!" << endl; vector<int> list = { 8,9,1,7,2,3,5,4,6

犹有傲霜枝的博客 785

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[AcWing]787. 归并排序(C++实现)模板题

[AcWing]787. 归并排序(C++实现)模板题1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路:归并排序,通过两个指针指向的值比较大小完成调整两个区间段的值 3. 解法 ---------------------------------------------------解法---------------------------------------------------

cloud的博客 458

c++ 模板实现 -- 直接插入排序和归并排序

刚刚学习c++模板,试着写了几个程序:#include using namespace std;template class Sort{ private:  int length;  T * array; public:  Sort(int size);  void initArray();  void dispArray();  void insertSort();  void mergeS

少帅的天空 1715

归并排序c++模板

#include<iostream> using namespace std; int arr[] = {5,4,9,3,7,1,8,0}; void merge(int l,int r) { int mid = (l + r) / 2; mid++; int ls = mid - l; int rs = r - mid + 1; int left[ls],right[rs]; for(int i = l;i < mid;i++) left[i-l] = arr[i];

harry12138小白的博客 452

C++归并排序模板——支持lambda表达式,仿函数,迭代器

#include<iostream> #include<vector> using namespace std; template<typename _Iter, typename _Pred> void merge_sort(_Iter begin, _Iter end, _Pred pred) { if (begin + 1 >= end) return; size_t size = distance(begin, end); _Iter mid =.

ItaLink 369

c++模板实现归并排序

最近正在学习各种排序算法,今天实现了归并排序。先上代码: #include "stdafx.h" #include template void Merge(T A[],const int& p,const int& q,const int& r) // p表示开始排序的位置,q是结束位置,r是断点 { T *A_array_help = new

zyaiwx的专栏 596

模板 C/C++ 归并排序

一、基本思想 归并排序是建立在归并操作上的一种有效的排序算法。将已有的子序列合并,得到完全有序的序列。即先使每个子序列有序,再使子序列间有序。 归并排序的基本操作:分解、合并。 二、代码实现 #include&amp;lt;cstdio&amp;gt; using namespace std; int arr[100],temp[100]; int n; int read(int ans){ int f...

蒟篛小渣渣 387

快速排序、归并排序的C++模板实现

快速排序: template&lt;class T&gt; void Quicksort(T array[],int left,int right) { if (left == right) return; int mid = (left + right) / 2; T center,temp; int i = left, j = right; if (array[left]&gt...

知名画师方安排的blog 463

C++模板实现归并排序

归并排序的思想是将一个大的序列先进行二分法划分,直到划分到每个子序列只包含一个元素为止. 然后对序列进行依次合并,在合并的过程中实现排序.归并排序是一种典型的外部排序算法,需要额外的辅助空间来完成算法.算法分析: 1.稳定 2.时间复杂度: O(nlog(n)) 3.需要额外辅助空间来实现排序//Mergesort //1. Stable //2. Time complex O(nlog(n)

luanzheng_365的博客 632
上一篇: C++ lower_bound 的库使用和自己实现
下一篇: C++ 之二分查找(指定数、左边界、右边界)模板
zsiming
博客等级 码龄7年 43粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值