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

医学影像处理实战:如何用Python+SimpleITK搞定DICOM/NIfTI重采样(附完整代码)

本文详细介绍了如何使用Python和SimpleITK库实现医学影像(DICOM/NIfTI格式)的智能重采样技术。通过实战代码演示,帮助读者掌握医学图像处理中的关键步骤,包括环境搭建、数据准备、核心算法实现和质量验证,解决医学AI领域中的影像标准化难题。

linux的博客 981

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

CCS8.1 导入CCS3.3工程方法

    CCS3.3作为开发人员使用最广开发工具,研究人员手上存在不少该版本的建立的程序版本,然而随着TI公司推出高级版本的CCS平台,在新的平台上集成了更加丰富的功能和优点。利用新版本的平台在开发和编译旧版本工程上可以节省大量时间和精力。在使用新版本开发3.3版本工程时,首要解决的就是加载3.3的工程文件,现将加载过程记录如下: 第一步:Project-&gt;Import Legacy CC...

1万+

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

反射机制——通过反射调用service中方法

需求:现在有一群service接口,有同一个方法名称,内部逻辑除了调用不同的调用自身的方法外其他基本都一致,那现在就需要一个独立的方法来勾勒出这个方法 1.SpringContextUtil package com.XXX.report.util; import org.apache.log4j.Logger; import org.springframework.beans.BeansE...

东天里的冬天 8521

视图库对接系列(GA-T 1400)一、简单介绍

GA/T 1400《公安视频图像信息应用系统》 是我们需要参考看看的相关文档,里面有对应的标准和介绍,没有这个文档的话可以加群找我要。群的话 我放在最下面了。我们先简单想几个问题, 也就是这个协议主要干什么用的,为什么要有, 能做什么。

qq_37716298的博客 4288

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

YOLO11改进|注意力机制篇|引入MLCA轻量级注意力机制

YOLO11中添加MLCA轻量级注意力机制

A1983Z的博客 4056

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

再不入坑就晚了,深度神经网络概念大整理,最简单的神经网络是什么样子?

再不入坑就晚了,深度神经网络概念大整理,最简单的神经网络是什么样子?

我是香菜 3万+

YOLOv11改进策略【卷积层】| ICCV-2023 引入Dynamic Snake Convolution动态蛇形卷积,改进C3k2

基于拓扑几何约束的动态蛇卷积用于管状结构分割DSConv(Dynamic Snake Convolution,动态蛇形卷积)模块的设计主要是为了更好地处理管状结构的分割任务,解决传统卷积在处理细管状结构时的不足。

Limiiiing的博客 1629

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值