网课:第三章递归与分治思想---归并排序及相关运用

原理

把数组分为两半,两半分别排好序了,然后将两半数组排好序,形成一个有序数组。

时间复杂度:O(n*logn)

代码

复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[1000];
int b[1000];
void gb(int l,int r){
	if(l==r) return ;
	int mid=(l+r)/2;
	gb(l,mid);//分成两半
	gb(mid+1,r);
	int i=l,j=mid+1;
	int cnt=0;
	for(int k=l;k<=r;k++) {  //将两半重新排序成一个
		if( j>r || (a[i]<=a[j]&&i<=mid) )  //右半边的没有元素了或者左半边的有元素并且小于等于右半边的
			b[k]=a[i++];
		else 
			b[k]=a[j++];
	}
	for(int k=l;k<=r;k++) a[k]=b[k];
}
int main() {
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	gb(0,n-1);//数组下标
	for(int i=0;i<n;i++) cout<<a[i]<<" ";
}

思路:所有排序都是在消灭逆序对,我们可以利用排序来写。

暴力解法:(1)两重for循环枚举i和j

(2)逆序对的个数等于冒泡排序中交换的次数

优化解法:归并排序(从小到大排)在重新排序两个部分时,右指针小于左指针时(左边部分还有元素),左指针之后到mid的元素就是右指针的逆序对

复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
int a[1000];
int b[1000];
int cnt=0;
void gb(int l,int r){
	if(l==r) return ;
	int mid=(l+r)/2;
	gb(l,mid);
	gb(mid+1,r);
	int i=l,j=mid+1;
	int cnt=0;
	for(int k=l;k<=r;k++) {
		if( j>r || (a[i]<=a[j]&&i<=mid) ) 
			b[k]=a[i++];
		else {
			b[k]=a[j++];
			cnt+=mid-i+1;//逆序对
		}
			
	}
	for(int k=l;k<=r;k++) a[k]=b[k];
}
int main() {
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	gb(0,n-1);
	cout<<cnt;
}
相关推荐
阿正的梦工坊2 分钟前
【Rust】03-所有权、移动与复制
开发语言·算法·rust
一切皆是因缘际会13 分钟前
因果推理人工智能
大数据·数据结构·人工智能
好评笔记15 分钟前
深度学习面试八股—— GRU(Gated Recurrent Unit)
人工智能·rnn·深度学习·算法·机器学习·gru·校招
搞科研的小刘选手21 分钟前
【智能计算方向专题研讨会】第三届智能计算与数据分析国际学术会议(ICDA 2026)
大数据·算法·机器学习·数据挖掘·数据分析·可视化·计算
量化君也27 分钟前
桥水基金全天候策略拆解,构建中国ETF躺平版策略
大数据·人工智能·python·算法·金融·业界资讯
蓦然回首却已人去楼空35 分钟前
画图专用文档
算法
洛水水37 分钟前
【力扣100题】78.在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
江屿风38 分钟前
C++图论基础拓扑排序算法流食般投喂
开发语言·c++·笔记·算法·排序算法
海棠AI实验室1 小时前
AI 时代文献综述:从检索到成稿的 RAG 五步法
windows·算法·自动化·llm·rag
H178535090961 小时前
SolidWorks_基于草图的实体特征14_扫描扭转与控制
前端·人工智能·算法·3d建模·solidworks