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的博客 965

【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

WorkVisual传输程序报错_发现一个内部错误

WorkVisual传输程序报错_发现一个内部错误

qq_16401025的博客 2458

归并排序 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

视网膜血管分割数据集(DRIVE数据集,STARE数据集,REFUGE数据集,CHASE_DB1数据集,DiaRetDB1数据集)

在医学图像处理领域,视网膜图像分析对于眼部疾病的早期诊断与治疗具有举足轻重的意义。随着人工智能技术的蓬勃发展,尤其是深度学习算法在图像分割任务中的广泛应用,高质量的视网膜图像数据集成为推动该领域研究进展的关键要素。这些数据集不仅是训练和优化算法模型的基石,更是衡量算法性能优劣的重要依据。本文聚焦于视网膜图像分割领域,详细介绍 DRIVE、STARE、REFUGE、CHASE_DB1 以及 DiaRetDB1 这几个具有代表性的数据集。

weixin_43518285的博客 2270

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

使用LSTM(长短期记忆)模型处理文本数据的典型流程

对于序列到序列的任务(如机器翻译),可以使用LSTM的隐状态来生成目标序列。这些向量捕获了词之间的语义关系,每个词都被表示为一个高维空间中的点,语义上相似的词在向量空间中彼此靠近。这通常是通过创建一个词汇表(vocabulary)来实现的,词汇表中的每个词都会被分配一个唯一的数字ID。:由于LSTM等循环神经网络(RNN)需要固定长度的输入,所以需要将不同长度的句子填充到相同的长度。由于计算机不能直接理解连续的文本,第一步是将文本分割成独立的词或标记(token)。:将词嵌入作为输入传递给LSTM模型。

YHKKun的博客 2500

MySQL安装最后启动报错--Job for mysqld.service failed because the control process exited with error code. See

MySQL安装最后启动报错: [root@localhost mysql]# systemctl start mysqld Warning: mysqld.service changed on disk. Run 'systemctl daemon-reload' to reload units. Job for mysqld.service failed because the control process exited with error code. See "systemctl status m

chenchen的博客 2746

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

kettle写doris操作

文件在目录:doris-master\extension\kettle\assemblies\plugin\target\doris-stream-loader-plugins-9.4.0.0-343.zip。官方提供了doris stream load插件,下载源码编译后放到kettle的插件目录即可使用。地址:https://github.com/apache/doris.git。注意:需要doris插件或者kettle转换生成模板的私聊博主。使用PDmaner同步业务库生成建表语句。

weixin_44449054的博客 3031

归并排序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

2026年CSP-J初赛真题及答案解析

2026年CSP-J初赛真题及题解

王老师青少年编程 1629

uniapp(全端兼容) - 最新详细实现接入腾讯视频播放器功能插件,uniapp全平台端(小程序/H5网页/App/nvu)调用引入并使用腾讯视频播放组件完整全流程(详细示例源码,一键复制开箱即用)

uniapp腾讯视频,uniapp微信小程序腾讯视频,uniapp小程序接入腾讯视频详细示例教程源码,uniapp怎么在微信小程序平台使用腾讯视频插件,在uni-app中使用腾讯视频插件播放视频,uniapp调用腾讯视频,uniapp引入腾讯视频插件,uniapp小程序中引入腾讯视频无法播放,uniapp微信小程序平台引入腾讯视频播放不了黑屏,在uniapp开发的微信小程序中使用腾讯视频,uniapp如何引入腾讯视频插件播放视频,uni-app小程序平台引入腾讯视频插件播放腾讯视频,uniapp 小程序接入

✅ 精选推荐文章 1万+

归并排序(详解+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

linux v3h平台开发系列详解(GMSL摄像头篇):1.12 解串器MAX96712输出4 lane 变 2 lane的配置

本文详细介绍了在Linux v3h平台上,针对Max96712解串器进行MIPI 4lane到2lane配置。内容包括串行器解串器介绍、链路框架、硬件连接、以及软件寄存器如何配值和一些问题的解决方法。

xian18809311584的博客 1093

对单链表的归并排序的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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值