蓝桥杯试题:归并排序

一、问题描述

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

输入描述

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

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

数据保证 1≤n≤1000,1≤ai≤1061≤n≤1000,1≤ai≤106 。

输出描述

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

样例输入

复制代码
5
1 5 9 3 7

样例输出

复制代码
1 3 5 7 9

二、代码演示:

java 复制代码
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;
        }
    }

代码解释

归并排序方法

    • `public static int\[\] mergeSort(int\[\] arr, int l, int h)`:
  • `public`:方法可以被其他类访问。

  • `static`:方法属于类本身,而不是某个对象。

  • `int\[\]`:返回类型是整数数组。

  • `mergeSort`:方法名。

  • `int\[\] arr`:要排序的数组。

  • `int l`:当前处理的子数组的起始索引。

  • `int h`:当前处理的子数组的结束索引。

  1. if(l == h){

return new int\[\] {arrl};

}

当子数组只有一个元素时(`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 intleft.length + right.length;

int m = 0, i = 0, j = 0;

while(i < left.length && j < right.length){

numsm++ = lefti < rightj ? lefti++ : rightj++;

}

while(i < left.length)

numsm++ = lefti++;

while(j < right.length)

numsm++ = rightj++;

  • `int\[\] nums = new intleft.length + right.length;`:创建一个新的数组 `nums`,用于存储合并后的结果。

  • 合并过程:

  • 使用三个指针 `m`, `i`, `j` 分别指向 `nums`, `left`, `right` 数组的当前位置。

  • 比较 `lefti` 和 `rightj` 的大小,将较小的元素放入 `nums` 中,并移动相应的指针。

  • 当其中一个子数组的所有元素都被合并后,剩下的另一个子数组的元素依次放入 `nums` 中。

相关推荐
小O的算法实验室4 分钟前
2025年IEEE TASE,基于双层耦合平均场博弈的大规模智能体集成任务分配与轨迹规划
人工智能·算法·机器学习
8Qi89 分钟前
LeetCode 337:打家劫舍 III(House Robber III)—— 题解 ✅
算法·leetcode·二叉树·动态规划
地平线开发者9 分钟前
从 INT64 Div 算子约束到 Cast 修复全流程
算法
2601_9611940210 分钟前
教资科三美术考什么|初中高中美术题型考点和模板资料
leetcode·elasticsearch·职场和发展·蓝桥杯·pat考试·lucene
AI科技星12 分钟前
基于奇合数边界的离散解析数论与双螺旋宇宙本体大统一体系论文全部数学公式汇总表
人工智能·算法·机器学习·架构·学习方法
地平线开发者24 分钟前
Horizon 模型多 Batch 配置
算法·自动驾驶
czhaii36 分钟前
GB2312简体中文编码表
单片机·算法
8Qi81 小时前
LeetCode 121 & 122:股票买卖问题(DP 对比题解)✅
算法·leetcode·职场和发展·动态规划
一只齐刘海的猫1 小时前
【Leetcode】 接雨水
java·算法·leetcode
南境十里·墨染春水1 小时前
讲讲移动语义
算法