merge_sort

[HackerRank]Merge Sort Counting Inversions Merge Sort: Counting Inversions 这道题设定了一个情景,但其实是让我们复习merge sort。那么我们就来复习一下merge sort。 Merge sort的思想是先把数组分段,递归进行mergesort,再合并起来。有一个细节,在合并的过程中,可以借助合并的两段都是sort好的数列,利用这一特性合并起来会较快一些。送上伪代码: MergeSort(ar... 阅读详情

             归并排序是一种基于归并方法的排序。所谓归并是指将两个或两个以上的有序表合成一个新的有序表,包含所有元素。

             利用归并思想进行排序,可这样实现:首先将整个表看成是n个有序子表,每个子表的长度为1。然后两两归并,得到n/2个长度为2的子表。然后再两两归并,得到

      n/4个长度为4的有序子表。依此类推,直至得到一个长度为n的有序表为止。

           

            代码如下:

#include<iostream>
using namespace std;

const int MAX=0x7fffffff;

void merge(int a[],int p,int q,int r)
{
	int len1,len2,i,j;

	len1=q-p+1;
	len2=r-q;

	int *p1=new int[len1+1];
	int *p2=new int[len2+1];

	for(i=0;i<len1;i++)
		p1[i]=a[p+i];
	for(j=0;j<len2;j++)
		p2[j]=a[q+j+1];

	p1[len1]=MAX;   //哨兵,假设输入的数都是小于MAX的
	p2[len2]=MAX;

	i=j=0;
	for(int k=p;k<=r;k++)  //合并
	{
		if(p1[i]<=p2[j])
			a[k]=p1[i++];
		else
			a[k]=p2[j++];
	}

	delete [] p1;
	delete [] p2;
}

void merge_sort(int a[],int p,int r)  //递归算法
{
	int q;

	if(p<r)
	{
		q=(p+r)/2;   //划分

		merge_sort(a,p,q);
		merge_sort(a,q+1,r);

		merge(a,p,q,r);    //合并两子序列
	}
}

int main()
{
	int i,n,a[100];

	while(cin>>n,n)
	{
		for(i=0;i<n;i++)
			cin>>a[i];

		merge_sort(a,0,n-1);  //传递数组下标

		for(i=0;i<n;i++)
			cout<<a[i]<<" ";
		cout<<endl<<endl;
	}

	return 0;
}


            还有一种不需要设置哨兵的merge()代码,如下:

void merge(int a[],int p,int q,int r)
{
	int len1,len2,i,j,k;;

	len1=q-p+1;
	len2=r-q;

	int *p1=new int[len1];
	int *p2=new int[len2];

	for(i=0;i<len1;i++)
		p1[i]=a[p+i];
	for(j=0;j<len2;j++)
		p2[j]=a[q+j+1];

	i=j=0;
	k=p;
	while(i<len1 && j<len2)
	{
		if(p1[i]<=p2[j])
			a[k++]=p1[i++];
		else
			a[k++]=p2[j++];
	}

	/*两个while,最多只能执行一个*/
	while(i<len1)
		a[k++]=p1[i++];
	while(j<len2)
		a[k++]=p2[j++];
}


             Attention:

            ①归并排序不是就地排序,需要与原数组等量的存储空间。空间复杂度较高。

            ②归并排序的时间复杂度为O(nlog2n)。

 

 

    
排序算法—sort(),stable_sort(),merge() 排序目录:一.sort()二.stable_sort()三.merge()1.merge函数的作用:2.为什么引入归并排序merge()函数3.代码4.例题P1309 瑞士轮 一.sort() cppreference中的详细解释 二.stable_sort() stable_sort()遇见大小相同的值不会改变他们的位置 cppreference中的详细解释 三.merge() cpprefer... 阅读详情

相关推荐

合并排序算法 (Merge Sort)优化

Merge Sort很受欢迎 ,也经常出现在面试过程中。 之前写过一个Merge sort的一个算法(算法和大部分算法教程一样),本文对Merge sort做了些优化。 测试显示比之前的版本速度提高不少。 Merge Sort的主要思想是把一个大数组分解成小数组,分别对小数组进行sort,然后把sort好的两个小数组合并起来。 在合并的时候一般需要额外的空间来从放中间值。因此,分配空间的次

dddongdong的专栏 2873

归并排序的实现

import java.util.Arrays; public class Test {     public static void merge(int[] array, int start,int mid, int end){         int[] tmpArray =new int[ar...

beststudent_的博客 152

Hive中的Sort Merge Bucket Join

最近学习时发现 Hive 中还有一种 SMB Join,即 Sort Merge Bucket Join ,赶紧找资料学习了一波。。 map join 我们知道在 Hive 中当小表 join 大表时可以通过 map join 将小表中的数据读入内存,在 map 端 join 大表,从而省略 reduce 过程,大大加快连接的速度,但是当小表数据量过大内存放不下时就无法使用 map join 了,由此引出了 Sort Merge Bucket Join。 SMB join 要使用 SMB Join,所有的表

Jiangzhiqi4551的博客 1272

STL算法之merge sort

在中,我们对inplace_merge进行了简要的描述,但是对里面的细节描述的不是很清晰;本章进行更细致的拆解;同时merge将使用merge sort作为实现算法的主要手段。

chnming1987的博客 1151

什么情况下走sort merge join

SQL_ID cqsz37256v36j, child number 1 ------------------------------------- INSERT /*+append*/ INTO TMP_ACCT_AF NOLOGGING ( DATA_DATE , ACCT_NO , ACCT_ORD , ACCT_NO_PK , ACCT_BAL , D_CMP_BAL , M_CMP_...

zhaoyangjian724的专栏 493

sort merge join导致temp被爆菊

SQL_ID  cqsz37256v36j, child number 1 ------------------------------------- INSERT /*+append*/ INTO TMP_ACCT_AF NOLOGGING ( DATA_DATE , ACCT_NO , ACCT_ORD , ACCT_NO_PK , ACCT_BAL , D_CMP_BAL , M_

zhaoyangjian724的专栏 1334

Polyphase Merge Sort

Polyphase Merge Sort是一种External Sort算法,给定N个Tapes,只需要1个Tapes作为Output设备,而...

677

mips实现插入排序(非递归版)

mips实现插入排序,带详细注释,spim上可运行

[DB] Q3 External Merge Sort

External Merge Sort 是一种专为处理无法装入内存的大数据集而设计的排序算法。通过分块排序(Sorting)和分步合并(Merging),它能够高效地利用有限的内存资源完成排序任务。这种算法广泛应用于数据库和大数据处理场景中,尤其是在需要处理大量磁盘 I/O 的环境下表现尤为出色。Sorted Run 是 External Merge Sort 中的重要组成部分,用于分阶段处理和管理排序数据。通过Key/Value结构,它可以灵活适应不同的排序需求和存储场景。

m0_74331272的博客 1590

mips 汇编归并排序和二分查找源码和报告

I created a complex MIPS assembler program and execute a simulation with SPIM.In my program,I implemented several sub-programs:mergesort,binary search,a sum total value,average,maximum and minimum. First,a list of integers are given by user and sorted in the ascending order with the method of mergesort.Then a menu is shown to user and user can choose what he want.He can enter any of six numbers to choose a function.

mips-project-1:CIS 341 的 MIPS 汇编项目,它实现了函数 merge_sort 和 merge 来对数组进行排序

mips-project-1 CIS 341 的 MIPS 汇编项目,它实现了函数 merge_sort 和 merge 来对数组进行排序 为了运行这个汇编代码,我使用了 MIPS 模拟器 QtSpim: ://spimsimulator.sourceforge.net/

scala merge_sort排序

1.merge的原理图 2.下面给出代码 def merge(intArray: Array[Int], p: Int, q: Int, r: Int): Unit = { val n1 = q - p + 1 val n2 = r - q val MAX =100 var leftArray = new Array[Int](n1

历史豪杰 945

mergesort:归并排序正确性证明

归并排序 (相当)无痛依赖类型编程的案例:Agda 中完全认证的归并排序 Agda 中的合并排序正确性证明 我们在 Agda 中展示了一个经过完全认证的合并排序版本。 它的特点是:终止的句法保证(即不需要明确的终止证明),没有证明成本来确保输出被排序,并且几乎免费证明输出是输入的排列。 文档文件 sblp2014_submission_31.pdf - 提交给论文 源文件 Nat.agda - 第 2 节 - 有上限的自然数 Snat.agda - 第 2 节 - Agda 的大小类型介绍 MergeSort.agda - 第 2 节 - 使用 Sized Types 的终止检查合并排序 MergeSort3.agda - 第 3 节 - 合并排序算法针对列表排序规范的正确性证明 Permutation.agda - 第 3 节 - 排列相关的东西 MergeSort4.agda - 第

Sort Merge Join

Stage 1: 使用某种join key来对关系 R和关系S中的数据进行sort的操作,那么所有有着同样的key的tuple会按先后顺序进行排列。这是sort merge join的步骤。放出匹配的tuples。

weixin_45895230的博客 650

如何使用MCP2518FD外部CAN FD控制器实现速速CAN通信

1、SPI时序MCP2518FD外部CAN FD控制器具有小尺寸和SPI接口,可实现轻松连接。可将CAN FD通道轻松添加到缺少CAN FD外设或没有所需CAN FD通道的微控制器上。MCP2518FD支持经典格式 (CAN 2.0B) 和CAN灵活数据速率 (CAN FD) 格式中的CAN帧格式,符合ISO11898-1:2015标准。框图:本文实验板MCU:CAN FD控制器:MCP2518FDCAN FD收发器:ATA6560开发环境:想了解开发板更详细信息,请点击。

qq_57798018的博客 1万+

unity shader 后处理实现水墨风格渲染「Low Poly 」变「水墨画 」

水墨风格渲染 这次学校的比赛打算做一个中国古代背景的游戏,所以尝试做了水墨风格的渲染。 主要按以下四步来实现的效果: 根据色调和饱和度调整饱和度。 对图像进行模糊 水墨风格的物体边缘 物体内画笔笔触的模拟 接下来我分别就这四步依次展开说明: 调整饱和度 这里我使用Post-Processing Stack 的Color Grading 来调节饱和度,通过使用Grading Curv...

九级铁甲蛹的博客 1万+

Insertion Sort and Merge Sort

INSERTION-SORT(A)1 for j ← 2 to length[A]2     do key ← A[j]3 //Insert A[j] into the sorted sequence A[1..j - 1].4          i ← j - 15         while i > 0 and A[i] > key6               do A[i + 1] ← A

Pro的专栏 1280

PCA9698嵌入式C++驱动库:高性能I²C GPIO扩展方案

GPIO扩展是嵌入式系统中解决MCU引脚资源不足的关键技术,其核心原理在于通过串行总线(如I²C)桥接主控与外设寄存器,实现逻辑引脚到物理IO的映射与状态同步。技术价值体现在低开销、高确定性与多设备可扩展性,广泛应用于工业控制、传感器节点和LED矩阵驱动等实时场景。本文聚焦PCA9698——一款支持24通道双向IO、中断输出与可编程驱动模式的I²C GPIO扩展芯片,结合其C++驱动库的影子寄存器机制、端口级原子操作及非阻塞同步设计,提供面向资源受限平台(如ATmega2560)的工程就绪方案。

weixin_35756637的博客 628

sort_merge 合并排序

网上看到的sort_merge排序算法,此算法没有free。 #include #include #include #define random(i) (rand()%i) #define N 12 #define INFINITY 99999999 //要排序的数存放在a数组汇总,p,q,r是数组下标 void Merge(int *a,int p,int q,int r

aeoluspu的专栏 1231

人形机器人电源系统硬件开发:从原理图设计到PCB布局的完整流程

人形机器人是“移动的智能终端”,其电源系统如同“心脏+血管”:既要为大脑(主控)、肌肉(电机)、感官(传感器)提供稳定能量,又要在有限体积内应对高动态负载(如跳跃时电机瞬间大电流)。本文聚焦“硬件开发”维度,覆盖从需求分析到PCB制板的完整流程,适合硬件工程师、机器人爱好者快速掌握工程实战方法。

AI天才研究院 2177

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

【PINN物理信息网络】基于PINN物理信息网络求解圆柱坐标中的热方程(python)

k8291121的博客 2274
上一篇: HDU 1425 1280 3785 前m大数
下一篇: select_sort
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值