OpenJudge | 置换选择排序

news2024/11/26 12:22:41

总时间限制: 1000ms 内存限制: 65536kB
描述
给定初始整数顺串,以及大小固定并且初始元素已知的二叉最小堆(为完全二叉树或类似完全二叉树,且父元素键值总小于等于任何一个子结点的键值),要求利用堆实现置换选择排序,并输出第一个顺串。例如给定初始顺串29,14,35,13,以及堆(记为16 19 31 25 21 56 40), 置换选择排序得到的第一个顺串为16 19 21 25。

在这里插入图片描述

输入

第一行包含两个整数,m为初始顺串的数的个数,n为二叉最小堆的大小
第二行包含m个整数,即初始顺串
第三行包含n个整数,即已经建好的堆的元素(有序,按照从堆顶到堆底,从左到右的顺序)

输出

输出包含一行,即第一个顺串。

样例输入

4 7
29 14 35 13
16 19 31 25 21 56 40

样例输出

16 19 21 25

思路

  1. 我们知道这是一个小根堆,堆顶元素是最小的,我们可以将堆顶元素取出,将其放入res数组中,然后将堆顶元素删除,注意,在这一步当中是不用关注初始化顺串的元素的。
  2. 然后将初始的顺串中的下一个元素放入堆中,然后调整堆,使其满足堆的性质。
    1. 如果初始的顺串被选中的元素比res数组中的最后一个元素大,那么就将这个元素放入堆中,然后调整堆;否则将这个元素先放入堆,然后与堆的最后一个元素交换,堆的大小减一,最后调整堆。
  3. 然后将堆顶元素取出,放入res数组中,然后将堆顶元素删除。
  4. 重复上述步骤2、3,直到堆为空或者初始顺串中的元素全部被替换。

看完原理,我们可以将代码分为两个部分,一个是调整堆的代码,一个是置换选择排序的代码。

代码解析

先说调整堆的代码:

void reflushHeap(int n) {
    int i = 1;
	while(2*i <= n || 2*i+1 <= n) {
		if(2*i <= n && 2*i+1 <= n) {
			if(ar[2*i] < ar[2*i+1]) {
				if(ar[i] > ar[2*i]) {
					swap(ar[i], ar[2*i]);
					i = 2*i;
				}
			} else {
				if(ar[i] > ar[2*i+1]) {
					swap(ar[i], ar[2*i+1]);
					i = 2*i+1;
				}
			}
		} else if(2*i <= n && 2*i+1 > n) {
			if(ar[i] > ar[2*i]) {
				swap(ar[i], ar[2*i]);
				i = 2*i;
			}	
		} else break;
	}
}

然后是置换选择排序的代码:
这代码在排除输入部分之后是这样的:

while(t--) {
    if(n <= 0) break;
    res.push_back(ar[1]);
    if(res.back() > in[j]) {
        ar[1] = in[j];
        swap(ar[1], ar[n]);
        --n;
        reflushHeap(n);
    } else {
        ar[1] = in[j];
        reflushHeap(n);
    }
    ++j;
}

Code

#include <bits/stdc++.h>
#pragma GCC optimize(3,"Ofast","inline")
using namespace std;

int ar[1024], in[1024];

void reflushHeap(int n) {
	int i = 1;
	while(2*i <= n || 2*i+1 <= n) {
		if(2*i <= n && 2*i+1 <= n) {
			if(ar[2*i] < ar[2*i+1]) {
				if(ar[i] > ar[2*i]) {
					swap(ar[i], ar[2*i]);
					i = 2*i;
				}
			} else {
				if(ar[i] > ar[2*i+1]) {
					swap(ar[i], ar[2*i+1]);
					i = 2*i+1;
				}
			}
		} else if(2*i <= n && 2*i+1 > n) {
			if(ar[i] > ar[2*i]) {
				swap(ar[i], ar[2*i]);
				i = 2*i;
			}	
		} else break;
	}
}

int main() {
	vector<int> res;
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int m, n, t, j = 1;
	cin >> m >> n;
	res.reserve(m);
	for(int i = 1; i <= m; ++i) {
		cin >> in[i];
	}
	for(int i = 1; i <= n; ++i) {
		cin >> ar[i];
	}
	t = m;
	while(t--) {
		if(n <= 0) break;
		res.push_back(ar[1]);
		if(res.back() > in[j]) {
			ar[1] = in[j];
			swap(ar[1], ar[n]);
			--n;
			reflushHeap(n);
		} else {
			ar[1] = in[j];
			reflushHeap(n);
		}
		++j;
	}
	for(auto i: res) {
		cout << i << " ";
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2190239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员如何在 AI 时代保持核心竞争力

前言 随着 AIGC 大语言模型的不断涌现&#xff0c;AI 辅助编程工具的普及正在深刻改变程序员的工作方式。在这一趋势下&#xff0c;程序员面临着新的挑战与机遇&#xff0c;需要思考如何应对以保持并提升自身的核心竞争力。 目录 一、AI 对编程工作的影响 &#xff08;一&…

一、走进新语言

走进新语言 介绍环境配置JDK配置Kotlin配置 开发工具代码基本结构程序注释 介绍 Kotlin是一种现代但已经成熟的编程语言&#xff0c;旨在让开发人员更快乐。它简洁、安全、可与Java和其他语言互操作&#xff0c;并提供了许多在多个平台之间重用代码的方法。它由JetBrains公司于…

2.JUC

掌握 Java 并发编程&#xff0c;熟悉线程池、并发容器以及锁的机制&#xff0c;如 sychronized、ReentrantLock、AQS等。 2.0 并发基础 线程等待唤醒机制LockSupport (3种) 方式一&#xff1a;使用Object中的wait()方法让线程等待&#xff0c;使用Object中的notify()方法唤醒…

数据结构 ——— 单链表oj题:链表分割(带哨兵位单向不循环链表实现)

目录 题目要求 手搓简易单链表 代码实现 题目要求 现有一链表的头指针 ListNode* head &#xff0c;给一定值 x &#xff0c;编写一段代码将所有小于 x 的节点排在其余节点之前&#xff0c;且不能改变原来的数据顺序&#xff0c;返回重新排列后的链表的头节点 举例说明&a…

【包教包会】2D图片实现3D透视效果(支持3.x、支持原生、可合批)

将去年写的SpriteFlipper从2.x升级到3.x。 如果需要2.x版本或需要了解算法思路&#xff0c;请移步&#xff1a;https://blog.csdn.net/weixin_42714632/article/details/136745051 优化功能&#xff1a;可同时绕X轴和Y轴旋转&#xff0c;两者效果会叠加。 完美适配Web、原生…

typescript使用webpack打包编译问题

解决方案&#xff1a;在webpack.config.js中的mdule.exports中设置mode。 再次运行npm run start即可。

Python基本库的使用--urllib

开篇 本篇文章旨在总结urlib基本库的一些常用用法。 相关方法 urlopen 用户打开和读取URL。 import urllib.requestresponse urllib.request.urlopen(https://www.python.org) print(response.read().decode(utf-8))带data参数 import urllib.parse import urllib.requestda…

【计算复杂性理论】P可归约(归约,P-reducible)与P、NP、NP-Hard、NP-Complete问题

1 问题背景 如果想要了解P问题、NP问题、NP-Hard问题、NP-Complete问题之间的关系&#xff0c;那就需要从了解NP-complete问题和归约概念开始。上一篇文章中&#xff0c;我们介绍了计算复杂性理论的奠基之作《The Complexity of Theorem-Proving Procedures》&#xff0c;在这篇…

初识算法 · 滑动窗口(1)

目录 前言&#xff1a; 长度最小的子数组 题目解析 算法原理 算法编写 无重复长度的最小字符串 题目解析 算法原理 算法编写 前言&#xff1a; 本文开始&#xff0c;介绍的是滑动窗口算法类型的题目&#xff0c;滑动窗口本质上其实也是双指针&#xff0c;但是呢&#…

初识数据结构--时间复杂度 和 空间复杂度

数据结构前言 数据结构 数据结构是计算机存储、组织数据的方式(指不仅能存储数据&#xff0c;还能够管理数据-->增删改)。指相互之间存在一种或多种特定关系的数据元素的集合。没有单一的数据结构对所有用途都有用&#xff0c;所以我们要学习各种的数据结构&#xff0c;比…

[Python] 编程入门:理解变量类型

文章目录 [toc] 整数常见操作 浮点数字符串字符串中混用引号问题字符串长度计算字符串拼接 布尔类型动态类型特性类型转换结语 收录专栏&#xff1a;[Python] 在编程中&#xff0c;变量是用于存储数据的容器&#xff0c;而不同的变量类型则用来存储不同种类的数据。Python 与 C…

Springboot项目整合RabbitMQ+Redis实现可靠的阿里云短信异步收发功能(手把手实操详细教程)

文章目录 1、项目介绍1.1、项目描述1.2、项目结构 2、创建项目(idea)2.1、依赖引入2.2、 配置文件2.3、 数据库表2.4、 实体类2.5、 配置类2.6、 验证码服务类2.7、 短信发送服务类2.8、 消费者类2.9、发送服务类2.10、定时任务类2.11、启动类2.12、测试控制器 3、效果测试4、总…

计算机科学英语词汇汇总(上)(Computer Science English Complete Vocabulary)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…

对不经常变动的数据集合添加Redis缓存

目录 前言 什么是缓存 如何使用缓存 添加商户缓存 缓存模型和思路 实现代码 问题分析 解决方案 实现商铺和缓存与数据库双写一致 实现代码 前言 什么是缓存 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码 缓存…

【框架篇】过滤器和拦截器的区别以及使用场景

在项目开发中&#xff0c;常常会同时配置拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;&#xff0c;以下就是它们两个主要的区别&#xff1a; 过滤器&#xff08;Filter&#xff09; 配置和实现 Filter的实现还是很简单的&#xff0c;可…

提升快递管理效率的必备技能:教你批量查询与导出物流信息

在当今快节奏的商业环境中&#xff0c;快递与物流行业的效率直接关系到企业的运营成本和客户满意度。随着订单量的不断增加&#xff0c;如何高效地管理和追踪大量的物流信息成为了企业面临的一大挑战。批量查询与导出物流信息作为一种高效的数据处理手段&#xff0c;正逐渐成为…

微信小程序-npm支持-如何使用npm包

文章目录 1、在内建终端中打开2、npm init -y3、Vant Weapp4、通过 npm 安装5、构建 npm 1、在内建终端中打开 Windows PowerShell 版权所有 (C) Microsoft Corporation。保留所有权利。尝试新的跨平台 PowerShell https://aka.ms/pscore6PS C:\Users\dgq\WeChatProjects\minip…

重学SpringBoot3-集成Redis(三)

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;三&#xff09; 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码&#xff1a;自定义过期策略 3. 配置…

大学生就业招聘系统:Spring Boot技术解析

3系统分析 3.1可行性分析 通过对本大学生就业招聘系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大学生就业招聘系统采用JAVA作为开发语言&#xff0c;S…

【现代控制理论】第2-5章课后题刷题笔记

文章目录 第二章&#xff1a;线性控制系统的状态空间描述第三章&#xff1a;控制系统状态空间描述的特性3.1 计算状态转移矩阵&#xff08;矩阵指数函数&#xff09;3.2 计算系统的时间响应&#xff08;状态方程的解&#xff09;3.3 判断系统的能控性和能观性&#xff0c;以及能…