当前位置: 首页 > article >正文

【蓝桥】宝藏排序Ⅱ----Array.sort和PriorityQueue

在一个神秘的岛屿上,有一支探险队发现了一批宝藏,这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字,代表了其珍贵程度。然而,由于某种神奇的力量,这批宝藏的顺序被打乱了,探险队需要将宝藏按照珍贵程度进行排序,以便更好地研究和保护它们。作为探险队的一员,肖恩需要设计合适的排序算法来将宝藏按照珍贵程度进行从小到大排序。请你帮帮肖恩。

宝藏排序Ⅱ数据比较大,因此冒泡排序这里不行,Array.sort和
PriorityQueue在Java中排序性能更有且,这两种方法都能通过检测。

  • PriorityQueue
package yunkePra;

import java.util.PriorityQueue;
import java.util.Scanner;

public class p5test {
	public static void main(String[] args) {
	   Scanner scan = new Scanner(System.in);
	   int n=scan.nextInt();
	   PriorityQueue<Integer> queue = new PriorityQueue<>();
	   for(int i=0;i<n;i++) {
		   int num=scan.nextInt();
		   queue.add(num);
	   }
	   for(int i=0;i<n;i++) {
		   System.out.print(queue.remove()+" ");
	   }
       scan.close();
	}
}

  • Arrays.sort
package yunkePra;

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;

public class p5testSort {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		   int n=scan.nextInt();
		   int[] arr = new int[n];
		   for(int i=0;i<n;i++) {
			   arr[i]=scan.nextInt();
		   }
		   Arrays.sort(arr);
		   for(int i=0;i<n;i++) {
			   System.out.print(arr[i]+" ");
		   }
	       scan.close();
	}
}

让我们比较一下Java的PriorityQueueArrays.sort()方法在排序上的区别:

PriorityQueue

  1. 排序方式

    • PriorityQueue实现了一个优先级队列,它不是一个排序方法,但可以通过不断取出最小(或最大)元素来模拟排序。
    • 它使用堆(Heap)数据结构,默认是最小堆(Min Heap),每次remove()操作返回并移除堆中最小的元素。
  2. 性能

    • 插入元素(add)的复杂度是 (O(\log n))。
    • 移除最小元素(remove)的复杂度也是 (O(\log n))。
    • 总体排序时间复杂度为 (O(n \log n))。
  3. 空间复杂度

    • 需要额外的 (O(n)) 空间来存储队列。
  4. 稳定性

    • PriorityQueue不是稳定的,因为堆的性质会导致相同优先级的元素顺序可能改变。
  5. 适用性

    • 适用于需要频繁插入和删除最小(或最大)元素的场景,而不是一次性排序。

Arrays.sort()

  1. 排序方式

    • Arrays.sort()方法在Java 7及之前使用的是快速排序(QuickSort),在Java 8及之后改为使用双轴快速排序(Dual-Pivot Quicksort),这是一种改进的快速排序算法。
    • 它是原地排序,不需要额外的空间来存储数据。
  2. 性能

    • 平均时间复杂度为 (O(n \log n)),最坏情况也为 (O(n \log n))。
    • 实际性能通常优于PriorityQueue模拟排序,因为它是专门为排序设计的算法。
  3. 空间复杂度

    • 对于原始类型数组,空间复杂度为 (O(\log n))(用于递归调用栈)。
    • 对于对象数组,空间复杂度为 (O(n))(因为对象引用需要被复制)。
  4. 稳定性

    • Arrays.sort()是稳定的(在Java 8及之后)。
  5. 适用性

    • 适用于一次性排序整个数组或列表。

通过题目检测

  • PriorityQueue:通过你的代码模拟排序可以满足题目要求,因为它能正确地输出从小到大的排序结果。
  • Arrays.sort():直接调用Arrays.sort()方法也能通过题目检测,因为它能高效地对数组进行排序。

结论

  • 如果只考虑通过题目检测,两种方法都能完成任务。
  • Arrays.sort()在性能上通常会更优,因为它是专门为排序设计的,并且在Java中经过优化。
  • 使用PriorityQueue虽然也能排序,但它实际上是在模拟排序过程,更适合需要动态维护优先级队列的场景。
  • 如果题目要求在原地排序或考虑空间效率,Arrays.sort()会是更好的选择。

选择哪种方法取决于你的具体需求和对性能、空间使用以及算法特性的考虑。


http://www.kler.cn/a/404216.html

相关文章:

  • Spark SQL大数据分析快速上手-完全分布模式安装
  • 七、电机三环控制
  • 大语言模型---Llama模型文件介绍;文件组成
  • 如何在 PyCharm 中配置 HTTP 代理以确保网络连接的顺畅性
  • Elastic 和 Red Hat:加速公共部门 AI 和机器学习计划
  • 状态模式之状态机
  • LeetCode题练习与总结:Fizz Buzz--412
  • 深度解析神经网络中的最大池化层:工作原理、参数配置与应用示例
  • 「Java EE开发指南」如何使用Visual JSF编辑器设计JSP?(一)
  • 【vue】vue中.sync修饰符如何使用--详细代码对比
  • 【Word】一键批量引用论文上标——将正文字体改为上标格式
  • Flink升级程序和版本
  • word-毕业论文的每一章节的页眉单独设置为该章的题目怎么设置
  • Houdini和Blender如何使用CPU云渲染
  • 深度学习之One Stage目标检测算法2
  • 深入解析Python中的逻辑回归:从入门到精通
  • 哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性
  • 自然语言处理:第六十二章 KAG 超越GraphRAG的图谱框架
  • 【三合黑马指标】指标操盘技术图文教程,三线粘合抓黑马,短线买点持股辅助,通达信炒股软件指标
  • Linux13 传输层UDP和TCP协议
  • 微知-plantuml常用语法和要点以及模板?(note over、create、box,endbox、alt,else,end, autonumber)
  • qt 之 QDockWidget设置不可拖动
  • 【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
  • PIXHAWK(ardupilot4.52)单ic通道输出pwm
  • [QDS]从零开始,写第一个Qt Design Studio到程序调用的项目
  • ChatGPT Search VS Kimi探索版:AI搜索哪家强?!