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

归并排序

时间:2024-07-24 15:22:11浏览次数:12  
标签:归并 int 复杂度 pos mid 排序 left

  • 时间复杂度 \(o(nlogn)\)
  • 空间复杂度 \(o(n)\)
  • 模板:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N], b[N];

// 合并
void merge(int left, int right, int mid) {
	// 标记左右半区第一个未排序的元素
	int l_pos = left, r_pos = mid + 1;
	// 临时数组元素下标
	int pos = left;
	// 合并过程
	while(l_pos <= mid && r_pos <= right) {
		if(a[l_pos] < a[r_pos]) 	// 左半区第一个剩余元素更小
			b[pos ++] = a[l_pos ++];
		else						// 右半区第一个剩余元素更小
			b[pos ++] = a[r_pos ++];
	}
	// 合并左半区剩余元素
	while(l_pos <= mid) {
		b[pos ++] = a[l_pos ++];
	}
	// 合并右半区剩余元素
	while(r_pos <= right) {
		b[pos ++] = a[r_pos ++];
	}
	// 将临时数组复制回原来的数组
 	while(left <= right) {
		a[left] = b[left];
		left ++;
	}
}
// 归并排序
void msort(int left, int right) {
	// 如果只有一个元素, 那么就不需要继续划分
	if(left < right) {
		// 找中间点
		int mid = (left + right) / 2;
		// 递归划分左半区
		msort(left, mid);
		// 递归划分右半区
		msort(mid + 1, right);
		// 合并已经排序的部分
		merge(left, right, mid);
	}
}
int main() {
	cin >> n;
	for(int i = 0; i < n; i ++) {
		cin >> a[i];
	}
	msort(0, n - 1);
	for(int i = 0; i < n; i ++) {
		cout << a[i] << " ";
	}
    return 0;
}

标签:归并,int,复杂度,pos,mid,排序,left
From: https://www.cnblogs.com/yishujia/p/18320953

相关文章

  • 如何让 Mypy 认识到对两个整数进行排序会返回两个整数
    我的代码如下:fromtypingimportTuplea:Tuple[int,int]=tuple(sorted([1,3]))Mypy告诉我:赋值中的不兼容类型(表达式的类型为“Tuple[int,...]”,变量类型为“Tuple[int,int]”)我做错了什么?为什么Mypy无法弄清楚排序后的元组将返回两个整数?Mypy......
  • QListWidget实现内部拖动排序功能
    1.需求将QListWidget有很多的任务,需要拖动任务,手动进行排序,并且需要保存拖动之后的顺序,软件重新打开要是修改之后的顺序;(1)继承QListWidget,重写一个QListWidget自定义类#ifndefDROPLISTWIDGET_H#defineDROPLISTWIDGET_H#include<QListWidget>#include<QDropEvent>clas......
  • C++题目:DNA排序 代码
    题目描述现在有一些长度相等的 ......
  • Java实现七大排序(二)
    一.交换排序1.冒泡排序这个太经典了,每个学编程都绕不开的。原理跟选择排序差不多,不过冒泡排序是直接交换。publicstaticvoidbubbleSort(int[]array){for(inti=0;i<array.length-1;i++){for(intj=0;j<array.length-1-i;j++)......
  • 三种语言实现归并排序(C++/Python/Java)
    题目给定你一个长度为......
  • 易优CMS模板标签diyurl列表排序
    [基础用法]标签:diyurl描述:列表页、搜索页排序用法:Tag标签主页URL:{eyou:diyurltype='tags'/}登录URL:{eyou:diyurltype='login'/}注册URL:{eyou:diyurltype='reg'/}搜索主页URL:{eyou:diyurltype='sindex'/}多城市分站主页URL:{eyou:diyurltype='cit......
  • 分治法 -----归并排序、逆序对、最大子数组和
    一分治法概念分治(divide-and-conquer),顾名思义分而治之。分治的核心是将原问题分解为同类型的规模更小的子问题,子问题往往可以求解或者求解比较简单,通过整合子问题的解得到原来问题的解。分治的过程可以用如下图来表示:由上述图示可发现整个分治过程是一颗树,而且子问题的处......
  • css 蛇形排序
    先看效果需求:一个【4 *?】的网格布局,奇数行布局从左往右,偶数行布局从右往左。思路1:js将数组按4个每份进行分割,将偶数份进行反向,然后再将分割后的数据,重新组装。(太麻烦,劝退。)思路2:flex布局,然后用order属性来更改排列顺序。补充:or......
  • 【数据结构】排序算法——Lessen1
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • 冒泡排序与选择排序
    选择排序:(1)首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上。(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序(3)重复上述过程,共经过n-1趟排序后,排序结束排序原......