首页 > 其他分享 >归并排序

归并排序

时间:2023-11-02 10:13:10浏览次数:26  
标签:归并 x1 int l2 l1 排序 指针

//归并排序 
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
int n,a[N],b[N];
void h(int l1,int r1,int l2,int r2){//归操作 
//l1是第一部分的左指针 r1是第一部分的右指针
//l2是第二部分的左指针 r2是第二部分的右指针
	int t=1; //t为头指针 
	int x1=l1,x2=l2; //将l1给x1 l2给x2 
	while(x1<=r1&&x2<=r2){
		//谁小就将他给b[] 
		if(a[x1]<=a[x2]){
			b[t++]=a[x1++];
		}
		else{
			b[t++]=a[x2++];
		}
	}
	//有可能有剩余,就将他依次合并 
	while(x1<=r1){
		b[t++]=a[x1++];
	}
	while(x2<=r2){
		b[t++]=a[x2++];
	}
	//将排好b[]数组给a[] i指针控制a[] j指针控制b[] 
	for(int i=l1,j=1;i<=r2;i++,j++){
		a[i]=b[j];
	}
}
void f(int l,int r){//并操作 
	int m;
	if(l==r)	return ;
	else{
		m=(l+r)/2; //取整个数组的中间位置 
		f(l,m); //进行递归分左部分 l为左指针 m为右指针 
		f(m+1,r); //进行递归分右部分 m+1为左指针 r为右指针
	}
	h(l,m,m+1,r); //进行调用归操作函数 
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	f(1,n);
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}
	return 0;
}


标签:归并,x1,int,l2,l1,排序,指针
From: https://www.cnblogs.com/gongyuchen/p/17804782.html

相关文章

  • 项目管理之项目质量管理MoSCoW(莫斯科)优先级排序法
    项目质量管理是项目管理中至关重要的一环,它贯穿于项目的整个生命周期,包括项目启动、规划、执行、监控和控制。为了确保项目工作的质量,我们需要从多个方面入手,以下是一些关于如何保障项目工作质量管理的内容。项目产品质量检查路径项目准备阶段来自客户的质量期望验收标准与容许偏差......
  • 你真的懂排序吗?
    冒泡排序交换次数就是逆序对个数,设每个位置的数字向前形成的逆序对是\(c_i\),那么有序即\(c_i=0\)对每个\(i\)都成立,考虑冒泡中一次交换\((i,i+1)(a_i>a_{i+1})\)对\(c\)的影响,那么就是\(c_i\leftarrowc_{i+1}-1,c_{i+1}\leftarrowc_i\),全局逆序对\(-1\)。[USACO18OP......
  • 归并排序 Acwing 787
    归并排序最重要的一部便是归并,我们的模板顺序为:定义一个中间值,将我们的区间范围一分为二,我们将这两部分看成两个数组,我们分别将这两个数组进行归并排序,并且定义一个新的数组,将这两个数组排序好后导入到这个新数组中,并最后将这个定义的数组输出为原数组,即可实现归并排序。1......
  • 使用函数的选择法排序
    本题要求实现一个用选择法对整数数组进行简单排序的函数。函数接口定义:voidsort(inta[],intn);其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。裁判测试程序样例:#include<stdio.h>#defineMAXN10voids......
  • 归并排序统计逆序对的数量
    788.逆序对的数量-AcWing题库 昨天刚好做到这题,发现网上题解都讲的不是很详细,于是决定自己手写一篇。 归并排序能统计逆序对的数量 为什么归并排序能统计逆序对数量???归并排序的特点是,以mid,mid+1为分界,对两边分别进行排序借助递归的性质先将两边都从小到大排好序,之......
  • 【算法题】2826. 将三个组排序
    题目:给你一个下标从0开始长度为n的整数数组nums。从0到n-1的数字被分为编号从1到3的三个组,数字i属于组nums[i]。注意,有的组可能是空的。你可以执行以下操作任意次:选择数字x并改变它的组。更正式的,你可以将nums[x]改为数字1到3中的任意一个。你将按......
  • 复仇归并排序
     归并排序就是,把一群数据一直分,一直分,分到不能再分之后,一个个按顺序把你们装进去 讲讲第一个难点,上面两个mergesort归并,其实这是一个把人给分开,分成两组,接着再分,再分。。。分到没办法分的时候,往下走。。。然后接着就是定义指针ijk,然后就有一个困扰了我很久的问题,为什么可......
  • 排序算法——冒泡,插入,选择排序
    冒泡排序冒泡排序是一种简单的排序算法实际上是每一次排序都会将最大的元素放到最后比较相邻的元素,如果第一个比第二个大,就交换他们两个对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数针对所有的元素重复以上的步骤点击查看......
  • 快速排序学习
    //#include<bits/stdc++.h>#include<iostream>usingnamespacestd;voidquick_sort(intq[],intl,intr){if(l>=r)return;intx=q[(l+r)/2];inti=l-1,j=r+1;while(i<j){doi++;while(q[i]<x);doj--;while(q[j]>......
  • 排序(按照第一元素)
    按照元素的第一顺序排序//maybe贪心会用到structty{ intx,y;}a[N];boolcmp(tya,tyb){ if(a.x<b.x)returntrue; returnfalse;}intmain(){ intn; cin>>n; for(inti=1;i<=n;i++) { cin>>a[i].x>>a[i].y; } sort(a+......