Java中递归实现归并排序与多路合并:无包依赖的数组操作实践

Java中递归实现归并排序与多路合并:无包依赖的数组操作实践

本文深入探讨了在java中递归实现归并排序的方法,特别关注如何在不依赖`java.util.arrays.copyofrange`等标准库函数的情况下,手动实现数组分片操作。同时,文章详细介绍了标准的二路合并算法,并提供了一种健壮的三路合并函数的实现,旨在帮助开发者掌握底层数组操作和多路数据流的合并技巧。

1. 归并排序概述

归并排序(Merge Sort)是一种高效的、基于比较的排序算法,其核心思想是分治法。它将一个未排序的数组递归地分成两半,直到每个子数组只有一个元素(自然有序),然后将这些子数组两两合并,每次合并都使子数组有序,最终合并成一个完全有序的数组。归并排序具有稳定的特性,并且时间复杂度在所有情况下都保持O(n log n)。

2. 递归实现归并排序 (MergeSort)

归并排序的递归实现主要包含两个部分:mergeSort 函数用于递归地将数组分成更小的部分,以及 merge 函数用于合并两个已排序的子数组。

2.1. 无包依赖的数组分片:手动实现 copyOfRange

在Java中,java.util.Arrays.copyOfRange(array, from, to) 是一个非常方便的工具,用于从现有数组中截取一个子范围并创建一个新数组。然而,在某些场景下,例如要求完全不依赖标准库包或者为了深入理解底层机制,我们需要手动实现这个功能。

Arrays.copyOfRange(original, from, to) 的行为是复制从 from 索引(包含)到 to 索引(不包含)的元素。我们可以通过一个简单的循环来实现同样的功能:

立即学习“Java免费学习笔记(深入)”;

/** * 手动实现数组分片功能,类似于 Arrays.copyOfRange。 * 创建一个新数组,包含 original 数组从 from 索引到 to 索引(不包含 to)的元素。 * * @param original 原始数组 * @param from 起始索引(包含) * @param to 结束索引(不包含) * @return 包含指定范围元素的新数组 */private static int[] copyArray(int[] original, int from, int to) {    // 新数组的长度为 to - from    int[] res = new int[to - from];    // 遍历原始数组的指定范围,并复制到新数组中    for (int i = from; i < to; i++) {        res[i - from] = original[i];    }    return res;}

有了 copyArray 方法,我们就可以在 mergeSort 函数中替换 Arrays.copyOfRange:

闪念贝壳 闪念贝壳

闪念贝壳是一款AI 驱动的智能语音笔记,随时随地用语音记录你的每一个想法。

闪念贝壳 218 查看详情 闪念贝壳

/** * 递归实现归并排序。 * * @param A 待排序的数组 */static void mergeSort(int[] A) {    // 基本情况:如果数组长度小于等于1,则认为它已经有序,无需进一步排序    if (A.length > 1) {        int mid = A.length / 2; // 计算数组的中间索引        // 使用手动实现的 copyArray 方法分割数组        int[] leftArray = copyArray(A, 0, mid); // 左半部分:从0到mid-1        int[] rightArray = copyArray(A, mid, A.length); // 右半部分:从mid到A.length-1        // 递归地对左右子数组进行排序        mergeSort(leftArray);        mergeSort(rightArray);        // 将排序好的左右子数组合并回原始数组 A        merge(A, leftArray, rightArray);    }}

2.2. 标准两路合并函数 (Merge)

merge 函数负责将两个已排序的子数组合并成一个大的有序数组。这个过程通过维护三个指针(一个指向目标数组,两个分别指向两个源子数组)来实现。

/** * 将两个已排序的子数组 l 和 r 合并到目标数组 a 中。 * * @param a 目标数组,用于存放合并后的结果 * @param l 左子数组(已排序) * @param r 右子数组(已排序) */static void merge(int[] a, int[] l, int[] r) {    int i = 0, li = 0, ri = 0; // i: 目标数组指针, li: 左子数组指针, ri: 右子数组指针    // 当左右子数组都有元素时,比较它们当前指向的元素,将较小的放入目标数组    while (li < l.length && ri < r.length) {        if (l[li] < r[ri]) {            a[i++] = l[li++]; // 左子数组元素较小,放入目标数组,并移动相应指针        } else {            a[i++] = r[ri++]; // 右子数组元素较小(或相等),放入目标数组,并移动相应指针        }    }    // 如果左子数组还有剩余元素,将其全部复制到目标数组    while (li < l.length) {        a[i++] = l[li++];    }    // 如果右子数组还有剩余元素,将其全部复制到目标数组    while (ri < r.length) {        a[i++] = r[ri++];    }}

3. 多路合并:实现三路合并函数 (MergeArrays3)

除了标准的二路合并,有时我们可能需要合并多个(例如三个或更多)已排序的数组。三路合并的原理与二路合并类似,但需要同时比较三个数组的当前最小元素。

原始的三路合并尝试代码存在逻辑缺陷,例如比较条件不完善、指针使用不当以及对剩余元素的处理不足。一个健壮的三路合并函数应该在每一步都找到所有非空数组中最小的元素,并将其添加到结果数组中,然后移动相应数组的指针。当某个数组耗尽时,它就不再参与比较。

我们可以通过使用一个“哨兵值”(如 Integer.MAX_VALUE)来简化比较逻辑。当一个数组的指针超出其边界时,我们将其对应的当前值视为 Integer.MAX_VALUE,这样它就不会被选为最小元素,直到所有实际元素都被处理完毕。

/** * 将三个已排序的数组 a, b, c 合并成一个大的有序数组。 * * @param a 第一个已排序数组 * @param b 第二个已排序数组 * @param c 第三个已排序数组 * @return 合并后的有序数组 */public static int[] mergeArrays3(int[] a, int[] b, int[] c) {    int[] result = new int[a.length + b.length + c.length];    int i = 0, j = 0, k = 0, resPtr = 0; // i, j, k 分别为数组 a, b, c 的指针;resPtr 为结果数组指针    // 循环直到所有数组的元素都被处理完毕    while (i < a.length || j < b.length || k < c.length) {        // 获取当前指针指向的元素值,如果数组已耗尽,则使用 Integer.MAX_VALUE 作为哨兵值        int valA = (i < a.length) ? a[i] : Integer.MAX_VALUE;        int valB = (j < b.length) ? b[j] : Integer.MAX_VALUE;        int valC = (k < c.length) ? c[k] : Integer.MAX_VALUE;        // 找到三个值中的最小值,并将其添加到结果数组中        if (valA <= valB && valA <= valC) {            // 确保 valA 确实来自有效索引,避免在所有数组都耗尽时重复添加 MAX_VALUE            if (i < a.length) {                result[resPtr++] = a[i++];            } else {                // 如果 valA 是 MAX_VALUE 且被选为最小,说明所有数组都已耗尽,可以提前退出                break;            }        } else if (valB <= valA && valB <= valC) {            if (j < b.length) {                result[resPtr++] = b[j++];            } else {                break;            }        } else { // valC 是最小值            if (k < c.length) {                result[resPtr++] = c[k++];            } else {                break;            }        }    }    return result;}

4. 完整代码示例

将上述所有方法整合到一个完整的 Java 类中,包括一个 main 方法用于测试。

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;// import java.util.Arrays; // 根据要求,不使用 Arrays 包public class MergeSortWithManualCopy {    public static void main(String[] args) throws IOException {        BufferedReader R = new BufferedReader(new InputStreamReader(System.in));        System.out.print("请输入数组大小: ");

以上就是Java中递归实现归并排序与多路合并:无包依赖的数组操作实践的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/987844.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 21:08:09
下一篇 2025年12月1日 21:08:30

相关推荐

  • 欧易okx交易平台 v6.133.1 官方安卓版

    欧易okx v6.133.1 官方安卓版是一款为用户提供数字资产服务的移动端应用程序,它集成了全面的交易功能与资产管理工具,旨在为用户提供流畅和安全的数字资产交互体验。 欧易官网直达: 欧易官方app: 平台核心功能 多样化的交易选择 该平台为不同经验水平的交易者提供了丰富的交易产品。用户可以根据自…

    2025年12月9日
    000
  • 有销毁机制的币有哪些

    OKB、GT、DRDR、TPay、VISTA等代币通过销毁机制提升稀缺性,OKB一次性销毁6525万枚后总供应锁定2100万枚,价格24小时涨200%,GT持续季度销毁已减量59.54%,DRDR创新“销毁即入股”模型,TPay构建收益消费闭环,VISTA实现交易即销毁,MBG承诺4.4亿美元回购销…

    2025年12月9日
    000
  • binance币安交易所app v3.1.7 官方安卓版

    币安交易所的官方安卓应用是为用户提供移动端数字资产交易和管理服务的客户端。通过该应用,用户可以随时随地访问币安平台提供的各项功能,进行便捷的交易和账户操作。 币安官网直达: 币安官方app: 交易所核心功能 多样的交易选择 现货交易: 用户可以实时买卖多种数字资产,操作流程直观便捷,适合大多数用户进…

    2025年12月9日
    000
  • WLFI币能涨多少?WLFI代币经济、价格预测介绍

    本文旨在深入探讨WLFI代币的经济模型与核心价值,并结合市场多重因素分析其未来的价格潜力。通过了解其代币分配、应用场景及关键影响变量,投资者可以更全面地评估WLFI的长期发展前景。 wlfi币主流交易平台:官网地址以及app推荐 1、币安Binance: 2、欧易OKX: 3、HTX火币:     …

    2025年12月9日
    000
  • shib再过两年能消灭1个零吗

    柴犬币(SHIB)两年内有望达到0.0001美元,多家机构预测其2026至2028年可能实现破零,核心动力来自通缩销毁机制、Shibarium网络推动及生态扩展,但面临高流通量、市场竞争和实用性验证等挑战,需结合市场环境与长期发展综合评估。 柴犬币(SHIB)能否在两年内(即约2026年底前)删除一…

    2025年12月9日
    000
  • 欧意okx交易所注册地址及APP下载地址

    OKX官方注册地址为https://ouyijoin.com,用户可通过该链接完成注册并下载APP;Android用户可官网下载APK,iOS用户需切换海外Apple ID在App Store搜索“OKX”安装,安全验证包括启用2FA和实名认证。 本文将为您提供欧意OKX交易所的官方注册地址和APP…

    2025年12月9日
    000
  • 币圈交易所APP榜单 币圈十大交易所最新排行榜

    在数字资产的世界里,选择一个安全、可靠且功能强大的交易平台是每位参与者的首要任务。面对市场上琳琅满目的选择,新手和老手都可能感到困惑。本文旨在为您梳理当前市场上表现突出的十大交易所APP,帮助您根据自身需求,做出更明智的选择。 一、币圈十大交易所APP最新排行榜 1、币安 (binance):  作…

    2025年12月9日
    000
  • WLFI币是什么币?在哪里买?

    WLFI是WiFi Map的官方代币,用于解锁eSIM、离线地图等高级功能,并奖励用户贡献热点,持有者可享消费折扣,代币基于Polygon链,可通过OKX 、Binance 等平台购买或参与社区活动获得。本文将为您详细解读WLFI代币的核心用途,并介绍获取它的主要渠道,帮助您全面了解这个项目。 一、…

    2025年12月9日
    000
  • wlfi代币上交易所了吗

    WLFI代币目前尚未确认上线主流中心化交易所,投资者需通过官方渠道或CoinMarketCap、CoinGecko等平台核实其上市状态,若未上线,则可能仅在Uniswap、PancakeSwap等去中心化交易所(DEX)交易,用户可通过MetaMask等Web3存储连接DEX,输入官方获取的合约地址…

    2025年12月9日
    000
  • wlfi代币多少钱一个

    WLFI是LendFlare平台的治理代币,基于Convex Finance构建,用于优化Curve和Convex上的收益 farming。其价格受加密市场整体行情、平台TVL、治理与质押机制、供需关系及竞争环境影响。投资者可通过CoinGecko、CoinMarketCap或Uniswap等平台查…

    2025年12月9日
    000
  • 比特币交易所(数字货币交易平台) v3.1.7 官方安卓版

    本教程将为您详细介绍数字货币交易平台v3.1.7官方安卓版的下载与安装流程。这款平台旨在为用户提供一个安全、便捷的数字资产交易环境,您可以轻松进行各类主流数字资产的交易、管理和查询。我们深知获取官方正版应用的重要性,因此,本文提供的是该应用的官方下载链接,推荐您点击本文提供的下载链接,即可直接获取并…

    2025年12月9日
    000
  • 币圈头部账号8月都关注哪些币?

    DeFAI、DeFi和DeSci成为8月加密市场三大主流叙事,GRIFT、LINK、URO等代币获KOL关注,DeFAI涨45%、DeSci涨78%,ARB、APT、TAO被实盘做多盈利,MAGACOIN、XRP、PEPE受社区热捧,市场情绪向好但风险犹存。 8月的加密货币市场热闹非凡,头部交易员和…

    2025年12月9日
    000
  • 加密货币市场8月最受关注的项目有哪些

    2025年8月加密市场聚焦AI与区块链融合、RWA、高性能公链及实用型Memecoin,Ozak AI、Pepeto、BlockDAG、Sui、TRON等项目表现亮眼,资金活跃但伴随高风险,需警惕代币解锁带来的抛压及市场波动。 2025年8月的加密货币市场,资金活跃,创新涌动。投资者目光不再局限于比…

    2025年12月9日
    000
  • 欧意交易所app最新下载-欧意最新app6.133.0 官方正版

    欧意App是一款功能丰富的应用程序,旨在为用户提供便捷高效的服务体验。无论是日常信息获取、专业工具辅助还是在线互动交流,欧意App都能成为您的得力助手。本文将为您详细介绍如何获取欧意App的官方最新版本,确保您下载到安全可靠的正版应用。推荐您点击本文中提供的下载链接,即可直接获取欧意App,立即开启…

    2025年12月9日
    000
  • 虚拟货币交易所(行情软件) v6.1330 官方安卓版

    OKX官方合作伙伴认证 · 一站式安全交易体验 官网直达: 安卓安装包下载: 常见的数字货币应用类型 市面上类似功能的应用通常属于以下几类: 综合型交易所:像ACoinR这类平台,提供注册、充值、交易、提现等完整服务。它们支持多种数字资产的买卖,常采用保证金和杠杆交易模式,也集成资讯和OTC(场外)…

    2025年12月9日
    000
  • 欧意交易平台 v6.133.0 2025 官方安卓版

    欧易(okx)是全球知名的数字资产交易平台,其官方安卓应用 v6.133.0 版本为用户提供安全、高效的交易体验。这款应用支持多种数字货币交易,包括现货、合约以及法币交易,并集成了钱 包功能,方便用户管理数字资产。 OKX官方合作伙伴认证 · 一站式安全交易体验 官网直达: 安卓安装包下载: 主要功…

    2025年12月9日
    000
  • Tokens 市场监管新规出台,行业走向何方?

    Tokens市场监管新规将推动行业走向合规化与专业化,要求平台注册、加强反洗q措施,并对稳定币、证券型代币等实施分类监管,提升市场透明度与投资者保护,促使传统金融机构入局,同时推动全球监管合作。 2024年的金融版图正经历着一场前所未有的变革,其中,加密货币市场无疑是这场变革中最引人瞩目的焦点。当全…

    2025年12月9日
    000
  • Tokens 在物联网区块链中的应用潜力探索

    Tokens在物联网区块链中作为价值媒介,通过智能合约实现设备间自动化微支付与数据共享激励,结合区块链去中心化信任与设备数字身份,推动智能城市、供应链等场景落地,同时面临可扩展性、安全性和互操作性等挑战。 物联网(IoT)与区块链技术的融合,正在开启一个前所未有的新纪元。想象一下,您的智能家居设备不…

    2025年12月9日
    000
  • 主流交易所 Tokens 交易激增原因

    主流交易所代币交易活跃度激增,源于其生态赋能、通缩机制、市场情绪回暖、合规进展及营销推动。BNB、OKB、HT等代币通过手续费折扣、IEO参与、回购销毁等机制增强实用性与稀缺性,叠加交易所品牌效应与社区扩张,吸引资金流入。分析其活跃度需结合交易量、持币地址数、链上活跃度、官方动态、社交媒体情绪及衍生…

    2025年12月9日 好文分享
    000
  • Tokens 在跨境汇款中的优势与阻碍分析

    Tokens凭借区块链的去中心化、不可篡改和高效率特性,实现跨境汇款的瞬时价值转移,显著降低手续费与中间环节,提升全球资金流通效率,但面临监管差异、价格波动、技术门槛及安全合规等挑战,需通过稳定币与高效链网结合主流平台操作,并强化地址核对、私钥管理与合规意识以管控风险。 在数字经济浪潮席卷全球的当下…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信