蓝桥杯试题:归并排序

server/2025/2/13 8:30:11/

一、问题描述

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

输入描述

输入第一行包括一个数字 nn ,表示宝藏总共有 nn 个。

输入的第二行包括 nn 个数字,第 ii 个数字 a[i]a[i] 表示第 ii 个宝藏的珍贵程度。

数据保证 1≤n≤1000,1≤a[i]≤1061≤n≤1000,1≤a[i]≤106 。

输出描述

输出 nn 个数字,为对宝藏按照珍贵程度从小到大排序后的数组。

样例输入

5
1 5 9 3 7

 

样例输出

1 3 5 7 9

二、代码演示:

import java.util.Scanner;
import java.util.*;
public class Main{// 1:无需package
// 2: 类名必须Main, 不可修改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();arr = mergeSort(arr,0,n-1);for(int i = 0;i < n;i++){System.out.print(arr[i] + " ");}scan.close();}public static int[] mergeSort(int[] arr , int l ,int h){if(l ==  h){return new int[] {arr[l]};}int mid = (l + h) /2;int[] left = mergeSort(arr,l,mid);int[] right = mergeSort(arr,mid + 1,h);int[] nums = new int[left.length + right.length];int m =  0 , i = 0 , j = 0;while(i < left.length && j < right.length){nums[m++] = left[i] < right[j] ?left[i++] : right[j++];}while(i < left.length)nums[m++] = left[i++];while(j < right.length)nums[m++] = right[j++];return nums;}}

代码解释

归并排序方法


1. - `public static int[] mergeSort(int[] arr, int l, int h)`:
  - `public`:方法可以被其他类访问。
  - `static`:方法属于类本身,而不是某个对象。
  - `int[]`:返回类型是整数数组。
  - `mergeSort`:方法名。
  - `int[] arr`:要排序的数组。
  - `int l`:当前处理的子数组的起始索引。
  - `int h`:当前处理的子数组的结束索引。


2.  if(l == h){
    return new int[] {arr[l]};
}
当子数组只有一个元素时(`l == h`),直接返回该元素的数组,因为它已经是有序的。

3.分割数组

int mid = l + (h - l) / 2;
int[] left = mergeSort(arr, l, mid);
int[] right = mergeSort(arr, mid + 1, h);

- `int mid = l + (h - l) / 2;`:计算中间索引,避免直接用 `(l + h) / 2` 可能导致的整数溢出。
- `mergeSort(arr, l, mid)`:递归地对左半部分进行排序。
- `mergeSort(arr, mid + 1, h)`:递归地对右半部分进行排序。

4 合并两个有序数组

int[] nums = new int[left.length + right.length];

int m = 0, i = 0, j = 0;
while(i < left.length && j < right.length){
    nums[m++] = left[i] < right[j] ? left[i++] : right[j++];
}

while(i < left.length)
    nums[m++] = left[i++];
while(j < right.length)
    nums[m++] = right[j++];


- `int[] nums = new int[left.length + right.length];`:创建一个新的数组 `nums`,用于存储合并后的结果。
- 合并过程:
  - 使用三个指针 `m`, `i`, `j` 分别指向 `nums`, `left`, `right` 数组的当前位置。
  - 比较 `left[i]` 和 `right[j]` 的大小,将较小的元素放入 `nums` 中,并移动相应的指针。
  - 当其中一个子数组的所有元素都被合并后,剩下的另一个子数组的元素依次放入 `nums` 中。


http://www.ppmy.cn/server/167281.html

相关文章

深度学习框架TensorFlow怎么用?

大家好呀&#xff0c;以下是使用 TensorFlow 的详细步骤&#xff0c;从安装到构建和训练模型&#xff1a; 一、安装 TensorFlow 安装 Python&#xff1a;TensorFlow 基于 Python&#xff0c;确保已安装 Python&#xff08;推荐 Python 3.8 及以上版本&#xff09;。可通过 Pyt…

Redis中的某一热点数据缓存过期了,此时有大量请求访问怎么办?

1、提前设置热点数据永不过期 2、分布式中用redis分布式锁&#xff08;锁可以在多个 JVM 实例之间协调&#xff09;、单体中用synchronized&#xff08;锁只在同一个 JVM 内有效&#xff09; 编写服务类 import com.redisson.api.RLock; import com.redisson.api.RedissonCli…

C++ STL容器之set使用及复现

cset 1. 关联式容器 vector、list、deque、forward_list(C11) 等STL容器&#xff0c;其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身&#xff0c;这样的容器被统称为序列式容器。而 map、set 是一种关联式容器&#xff0c;关联式容器也是用来存储数据的&#x…

星动纪元ERA-42:端到端原生机器人大模型的里程碑式突破

近年来&#xff0c;人工智能技术飞速发展&#xff0c;尤其在机器人领域取得了显著进展。星动纪元近日发布的ERA-42端到端原生机器人大模型&#xff0c;无疑是这一领域的重大突破。这款模型结合自研的五指灵巧手星动XHAND1&#xff0c;能够完成各种复杂操作任务&#xff0c;并快…

Flink-DataStream API

一、什么样的数据可以用于流式传输 Flink的DataStream API 允许流式传输他们可以序列化的任何内容。Flink自己的序列化程序用于 基本类型&#xff1a;即字符串、长、整数、布尔值、数组复合类型&#xff1a;元组、POJO和Scala样例类 基本类型我们已经很熟悉了&#xff0c;下…

5、《Spring Boot自动配置黑魔法:原理深度剖析》

Spring Boot自动配置黑魔法&#xff1a;原理深度剖析 一、引言&#xff1a;为什么Spring Boot能“开箱即用”&#xff1f; Spring Boot的核心理念是**“约定优于配置”&#xff0c;开发者只需引入一个spring-boot-starter-web依赖&#xff0c;就能直接编写RESTful API&#xf…

github不翻墙就可以访问

目录 简介资料准备windows平台设置下载运行git设置firefox设置 ubuntu平台设置下载启动服务设置系统代理git设置firefox设置证书 注意事项 简介 由于github访问不稳定,严重影响了国内软件开发,在网上搜索并验证了一些方法.现在整理出来一个可以正常使用的方法, 在windows和Lin…

使用STM32F103C8T6和ESP8266链接阿里云

一、项目简介 基于 STM32F103C8T6 单片机和 ESP8266 Wi-Fi 模块&#xff0c;旨在实现通过 Wi-Fi 连接阿里云物联网平台&#xff0c;进行数据上传和远程控制 STM32F103C8T6&#xff1a;作为核心控制单元&#xff0c;负责系统的运算、数据处理和与外设的交互。STM32F103C8T6 具有…