C++ 归并排序

归并排序算法C++实现(超详细解析!!!!) 归并排序,其实就是一种分治算法 ,那么在了解归并排序之前,我们先来看看什么是分治算法。在算法设计中,我们引入分而治之的策略,称为分治算法,其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题,分而治之。 阅读详情

归并排序的原理:

(1)首先,把一个数组以中间元素为界限分成两组;

(2)然后“左边数组”和“右边数组”中的元素分别进行比较;

(3)最后合并两个已经排好顺序的数组,我们称之为归并排序。

#include <iostream>
#include <stdlib.h>
using namespace std;

/*******************************************/
/*  归并排序
/******************************************/

void Merge(int array[], int left, int mid, int right, int temp[])  //合并
{
	int i = left;  //左数组的下标array[i]{left ... mid}
	int j = mid + 1;  //右数组的下标array[j]{mid+1 ... right}
	int k = 0;  //k是temp数组的下标

	while (i <= mid && j <= right)
	{
		if (array[i] <= array[j])
		{
			temp[k++] = array[i++];
		}
		else
		{
			temp[k++] = array[j++];
		}
	}

	
		while (i <= mid)  //把剩余的元素放到temp数组中
		{
			temp[k++] = array[i++];
		}

		while (j <= right)  //把剩余的元素放到temp数组中
		{
			temp[k++] = array[j++];
		}

		for (i = 0; i < k; i++)  //更新原始数组元素
		{
			array[left + i] = temp[i];
		}
}


void MergeSort(int array[], int left, int right, int temp[])  //归并排序函数
{
	if (left < right)
	{
		int mid = (left + right) / 2;
		MergeSort(array, left, mid, temp);  //左边归并排序,使得左数组有序
		MergeSort(array, mid + 1, right, temp);  //右边归并排序,使得右数组有序
		Merge(array, left, mid, right, temp);  //将左、右有序的数组进行合并
	}
}


int main(void)  //主程序
{
	const int n = 6;  //数组元素的数量
	int array[n];
	int temp[n];
	cout << "请输入6个整数:" << endl;
	for (int i = 0; i < n; i++)
	{
		cin >> array[i];
	}

	cout << endl;  //换行

	MergeSort(array, 0, n - 1, temp);  // 调用MergeSort函数  进行合并

	cout << "由小到大的顺序排列后:" << endl;
	for (int i = 0; i < n; i++)
	{
		cout << "Array" << "[" << i << "]" << " = " << temp[i] << endl;
	}

	cout << endl << endl;  //换行

	system("pause");  //调试时,黑窗口不会闪退,一直保持
	return 0;
}

运行结果:

C++归并排序 今天我们学习了排序中又快又稳定的算法:归并排序,时间复杂度为 O(nlogn)。代码很简洁,很容易懂。 阅读详情

相关推荐

c++十大排序——归并排序

算法基本知识铺垫 有些人可能不知道什么是稳定排序、原地排序、时间复杂度、空间复杂度,我这里先简单解释一下: 1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序 2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。 3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储 空间进行比较和交换的数据排序。 4、非原地排序:需要利用额外的数组来辅助排

yang_yi520的博客 3971

C++算法之归并排序

C++算法之归并排序 文章目录C++算法之归并排序一、归并排序思想二、排序步骤三、代码实现四、复杂度分析 一、归并排序思想 回顾快速排序的基本思想:找出一个分界线,并以该分界线为界将数组分为两部分,再对这两部分以同样的方式分别排序。 但是!快速排序作为一种高效率的算法,它的缺点在于算法的复杂度很依赖分界线的选取。因为这决定了左右两边划分的元素个数是否平衡。 那么,我们能不能变通一下,规避这种情况带来的效率损失呢? 回忆快速排序中,正是因为分界线的存在,使得划分到两边的数字排好序后,通过分界线的连接,能够

R_mine的博客 4740

C++如何实现的归并排序算法

归并排序的算法我们通常用递归实现,先把待排序区间[first, last]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[first,last]。1、比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到temp[k]中,并令i和k分别加上1;本文主要介绍了C++实现的归并排序算法,结合实例形式详细分析了归并排序算法的原理、实现步骤、操作技巧与使用方法,需要的朋友可以参考下。赋值操作的次数是(2nlogn)。

xiaoweids的博客 964

【C/C++】排序算法之归并排序

归并排序 文章目录归并排序一、归并排序是什么?二、基本实现1.合并(治)2.排序(分)3.完整代码 一、归并排序是什么? 归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 时间复杂度 O(n log n) 空间复杂度 T(n) 简而言之,归并排序是将大问题拆分成几个小

MaxwellWong 1718

C++链表实现归并排序

C++ 链表实现的归并排序 首先是定义和创建两个链表用来排序 typedef int ElemType; typedef struct LNode { ElemType data; struct LNode * next; }LinkNode; void CreateListF(LinkNode * &L, ElemType a[], int n) { LinkNode...

看起来喜欢做枯燥事情的人或许只是更清楚自己想要什么罢了 734

C++模板归并排序

C++模板实现归并排序

上善若水 1260

cpp实现归并排序超级详解

它的核心思想是将一个大问题分解成多个小问题分别解决,然后将小问题的解合并成大问题的解。在归并排序的实现中, merge 函数的这两行代码用于计算两个子数组的长度。n1 = mid - left + 1 = 2 - 0 + 1 = 3 ,表示左子数组的长度为 3。中,当i或者j的一方达到长度,循环就终止,那么i或j就有可能还没有达到其子序列的长度,所以利用这两个。n2 = right - mid = 5 - 2 = 3 ,表示右子数组的长度为 3。请编写代码,完成排序,对给定数据进行升序排列。

lzy45789的博客 1250

C++排序算法:归并排序详解

C++排序算法:归并排序详解

小天狼星_布莱克 的博客 3万+

归并排序C++算法实现

定义:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 简单的来说,归并排序主要分为三步,一是对数组的划分,二是对数组的排序,三是对数组的合并。划分的大小是可以随自...

Eggy个蛋 2万+

归并排序 C++

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

小天狼星_布莱克 的博客 4162

STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入

本例程使用STM32G070xx芯片,Flash大小128KB,Flash每页(2048字节)写满后再擦除。操作存储区分为64块,每块32字节,即写满64次擦除一次;标定存储区分为16块,每块128字节,即写满16次擦除一次,每个存储区的块都有各自的头部标记

RaphaelCeo的博客 1545

归并排序 mergesort.cpp

#include<iostream> using namespace std; const int N=10; class Mergesort{ private: int arr[N]; int M,L,R; public: void merge(int arr[],int L,int M,int R); ...

乐酱的博客 335

Unreal Engine鸿蒙移植实战:环境配置、构建流程与性能优化指南

游戏引擎移植是跨平台开发中的关键技术环节,其核心原理在于通过适配目标操作系统的底层接口和工具链,实现同一套代码在不同硬件和软件环境下的高效运行。这项技术的价值在于最大化代码复用率,降低多平台维护成本,并能让应用快速触达新兴生态系统的用户。在移动游戏和XR应用领域,随着鸿蒙HarmonyOS生态的快速发展,将成熟的商业引擎如Unreal Engine迁移至此平台,成为开发者探索新市场机会的重要路径。本文聚焦于Unreal Engine项目向鸿蒙系统的移植实践,详细解析了从环境搭建、源码适配到构建打包的全链路流

weixin_29011395的博客 410

CPP之归并排序

思路: 将一个数组一分为二 分别对左右两边进行递归 用两个指针分別指向左右边第一个元素 比较两指针指向元素的大小,比较完后,赋值给一个空数组 有一边剩下的元素直接放到数组中 对原数组重新赋值 模版: void merge_sort(int q[],int left,int right) { if (left >= right) return; int mid = right + left>>1; merge_sort(q,left,mid);

极客文化 465

告别混乱接线!用EPLAN 3D布局图,手把手教你搞定电气柜的3D建模与自动布线

本文详细介绍了如何使用EPLAN 3D布局图进行电气柜的3D建模与自动布线,帮助工程师告别混乱接线。从项目准备、基础结构建模到智能设备布局与逻辑定义,再到高级布线技术与问题排查,提供了一套完整的实战指南。通过EPLAN的3D功能,显著提升设计效率与系统可靠性。

weixin_30680385的博客 340

超大规模AI集群跨数据中心互联:Scale-Across技术实现与部署实践

分布式系统通过将计算任务分散到多个节点协同执行,实现算力的横向扩展。其核心原理在于网络通信、数据同步和资源调度机制的技术协同。在AI基础设施领域,分布式架构能有效突破单数据中心算力瓶颈,支撑万亿参数大模型训练。特别是面对长距离传输时延和带宽稳定性挑战,需要采用RDMA、确定性网络等关键技术。Scale-Across作为分布式系统的高级形态,通过跨地域多数据中心互联,构建逻辑统一的AI算力池,为超大规模AI训练和全球推理服务提供核心支撑。本文聚焦AI集群跨数据中心互联的技术路径,涵盖全栈优化、网络自治等实践方

chouxuyi9789的博客 400

C++归并排序代码

C++归并排序代码 #include <iostream> #include <vector> using namespace std; //合并两个已排好序的数组 void merge(vector<int> & arr, int low, int mid, int high) { //创建临时数组存放合并的数组 int *temp = new int(high - low + 1); int i = low, j = mid + 1

weixin_42383066的博客 1134

用Navicat轻松管理魔兽世界私服数据库:修改IP、添加装备的实用技巧

本文详细介绍了如何使用Navicat管理魔兽世界私服数据库,包括修改服务器IP、添加自定义装备和调整角色属性等实用技巧。通过专业的SQL操作指南,帮助玩家轻松实现私服的高级定制,提升游戏体验。

fanta的博客 941

归并排序C++

今天,学习归并排序,遇到个讲的很好的大佬,记录下。 大佬已经讲得很明白了(我自认是没法比大佬讲的更易懂了) 不过他的代码是c版本的,我就补充发下c++版本的(自己写的,,没有多组数据实验。。bug了再告诉我吧!) 代码: #include <bits/stdc++.h> using namespace std; void guibingSort(int a[10], int low, int high); void partion(int a[10], int low, int h

m0_55984237的博客 618

闲鱼爬虫实战:模拟手机端破解反爬策略,爬取指定商品搜索数据,爬取闲鱼搜索指定商品(需手机端模拟)o 技术点:抓包分析、cookie与token

技术点作用抓取手机 App 请求,分析 API 结构、Header、参数加密情况requestsPython 中最常用的 HTTP 库,用于发送模拟请求Session 对象自动管理 Cookie,保持会话User-Agent & 设备特征模拟手机型号、系统版本,绕过服务端检测闲鱼部分接口存在签名,需要逆向或复用有效 Token多线程/异步提高爬取效率(需节制,避免封 IP)解析 HTML 或 JSON 数据注意:闲鱼的接口加密程度中等偏上,部分接口存在动态签名(如x-signx-mini-wua。

2201_76125261的博客 712

Android一个APP里面最少有几个线程

Android应用启动时,默认会创建一个进程,该进程中最少包含负责处理用户交互、UI更新等核心操作,所有与界面相关的逻辑必须在此线程执行。若在此线程执行耗时操作(如网络请求),会导致界面卡顿甚至触发ANR(应用无响应)。当对象重写了finalize()方法时,该线程负责将这些对象放入队列并调用其finalize()方法,完成资源释放后再由GC回收。监控的执行效率。如果finalize()方法执行超时(默认10秒),此线程会触发虚拟机退出以防止应用长时间阻塞。

编程进化论 613

归并排序(详解+cpp代码)

归并排序: 步骤: 1.确认分界点 mid=(l+r)/2 2.递归排序(压栈思想,下文介绍) 3.归并,合二为一 排序过程: 代码部分: #include<iostream> using namespace std; const int N=1000000; int n; int q[N]; int tmp[N]; void merge_sort(int q[],int l,int r) { if(l>=r) return;//一个数,结束 int mid= l+r >

weixin_51222764的博客 400

Android 15.0 添加自定义服务,并生成jar给第三方app调用

在15.0系统ROM产品定制化开发中,由于需要新增加自定义的功能,所以要增加自定义服务,而app上层通过调用自定义服务,来调用相应的功能,所以系统需要先生成jar,然后生成jar 给上层app调用,接下来就来分析实现的步骤,然后来实现相关的功能 从而来实现所需要的功能

安卓兼职framework和app工程师的博客 668

对单链表的归并排序的C++实现

前言 记录用C++实现基于单链表的归并排序 代码 一共三个文件SingleLinkedList.h, CNode.h以及main.cpp。 首先是CNode.h #ifndef _NODE_H__ #define _NODE_H__ class CNode{ private: int data; CNode *nextNode; public: CNode(); void setData...

Hikers、Wan的博客 894

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: C++ 堆排序
下一篇: C++ 基数排序
dong.x_辛旭东
博客等级 码龄9年 11粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值