Java归并排序:修复数组元素覆盖问题及代码优化

java归并排序:修复数组元素覆盖问题及代码优化

本文旨在解决Java实现归并排序时出现的数组元素覆盖问题,该问题导致排序只能处理少量元素。文章将分析问题代码,指出错误原因,并提供修正后的代码示例。此外,还会探讨代码风格优化,建议使用接口而非具体类进行编程。

问题分析

提供的Java代码实现了归并排序算法,但存在一个关键错误,导致在合并过程中覆盖了原始数组 a 中的元素。具体来说,错误发生在 merge 方法的最后一步,它使用 a.add(from+j, b.get(j)) 将排序后的元素添加到数组 a 中。add 方法会在指定位置插入元素,导致数组长度增加,并移动后续元素,从而覆盖了未排序的部分。

解决方案

正确的做法是使用 a.set(from+j, b.get(j)) 替换 a.add(from+j, b.get(j))。set 方法用于替换指定位置的元素,而不会改变数组的长度。

修改后的 merge 方法如下:

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

public static void merge(ArrayList a, Integer from, Integer mid, Integer to){    Integer n = to - from + 1;    ArrayList b =  new ArrayList(n);    Integer i1 = from;    Integer i2 = mid +1;    Integer j = 0;    while(i1<= mid && i2 <= to)    {        if(a.get(i1).compareTo(a.get(i2))<0)        {            b.add(a.get(i1));            i1++;        }        else        {            b.add(a.get(i2));            i2++;        }        j++;    }    while (i1 <= mid)    {        b.add(a.get(i1));        i1++;        j++;    }    while (i2 <= to)    {        b.add(a.get(i2));        i2++;        j++;    }    for(j = 0; j< n; j++)    {        a.set(from+j, b.get(j));    }}

通过将 add 替换为 set,可以确保合并后的元素正确地替换原始数组中的相应位置,从而实现完整的归并排序。

代码小浣熊 代码小浣熊

代码小浣熊是基于商汤大语言模型的软件智能研发助手,覆盖软件需求分析、架构设计、代码编写、软件测试等环节

代码小浣熊 51 查看详情 代码小浣熊

代码风格优化

在Java编程中,推荐使用接口而非具体类进行编程,这有助于提高代码的灵活性和可维护性。例如,可以将 ArrayList 替换为 List。

修改后的代码示例:

import java.util.ArrayList;import java.util.List;public class MergeSort {    public static void mergeSort(List a, Integer from, Integer to) {        if (from == to) {            return;        }        Integer mid = (from + to) / 2;        mergeSort(a, from, mid);        mergeSort(a, mid + 1, to);        merge(a, from, mid, to);    }    public static void merge(List a, Integer from, Integer mid, Integer to) {        Integer n = to - from + 1;        List b = new ArrayList(n);        Integer i1 = from;        Integer i2 = mid + 1;        Integer j = 0;        while (i1 <= mid && i2 <= to) {            if (a.get(i1).compareTo(a.get(i2)) < 0) {                b.add(a.get(i1));                i1++;            } else {                b.add(a.get(i2));                i2++;            }            j++;        }        while (i1 <= mid) {            b.add(a.get(i1));            i1++;            j++;        }        while (i2 <= to) {            b.add(a.get(i2));            i2++;            j++;        }        for (j = 0; j < n; j++) {            a.set(from + j, b.get(j));        }    }    public static void main(String[] args) {        List patients = new ArrayList();        patients.add("Charlie");        patients.add("Alice");        patients.add("Bob");        patients.add("David");        patients.add("Eve");        mergeSort(patients, 0, patients.size() - 1);        System.out.println("Sorted patients: " + patients);    }}

在这个修改后的版本中,mergeSort 和 merge 方法的参数类型都从 ArrayList 更改为 List。 这样,你可以更容易地将 mergeSort 方法与不同的 List 实现一起使用,例如 LinkedList,而无需修改 mergeSort 方法本身。

总结

本文详细分析了Java归并排序中出现的数组元素覆盖问题,并提供了解决方案,即将 add 方法替换为 set 方法。此外,还讨论了代码风格优化,建议使用接口而非具体类进行编程。通过这些改进,可以确保归并排序算法的正确性和代码的可维护性。

以上就是Java归并排序:修复数组元素覆盖问题及代码优化的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月3日 17:22:01
下一篇 2025年11月3日 17:22:59

相关推荐

  • React路由保护:解决异步认证状态与初始渲染的同步问题

    ;一旦isLogin的状态确定(不再是undefined),组件将根据其布尔值决定是渲染受保护的子组件(children),还是使用Navigate组件将用户重定向到根路径(通常是登录页)。replace prop确保重定向发生时,浏览器的历史记录中不会保留当前页面的记录,防止用户点击返回按钮回到受…

    2025年12月21日
    000
  • 正确使用Promise.all()解决React中异步数据收集问题

    本文深入探讨了在react应用中从firestore等服务异步获取嵌套数据时遇到的常见问题:当尝试使用`foreach`循环收集异步操作的结果时,可能会因为异步回调未被等待而导致返回空数组或未定义的数据。文章详细阐述了如何通过结合使用`array.prototype.map()`生成promise数…

    2025年12月21日
    000
  • NestJS项目Jest升级至29.5.后测试失败问题排查与解决方案

    针对nestjs项目在jest升级到29.5.*版本后,单元测试出现`cannot read properties of undefined ‘*request’`错误的常见问题,本文提供了详细的排查思路与解决方案。核心在于审查并移除测试代码中不必要的`mockrestore…

    2025年12月21日
    000
  • 解决React路由保护组件中异步认证状态的渲染时序问题

    。由于isLogin此时为false,用户会被立即重定向到根路径/,即使后续的API调用可能会验证用户实际上是登录状态。这种行为导致了不佳的用户体验,因为它在用户尚未明确认证状态时就做出了错误的路由判断。 解决方案核心:引入“不确定”状态 解决上述问题的关键在于引入一个“不确定”或“加载中”的中间状…

    2025年12月21日
    000
  • JavaScript 代码混淆、压缩与源映射:优化与调试生产代码

    本文深入探讨javascript代码的压缩与混淆技术,旨在提升网页加载速度和代码安全性。文章将介绍如何利用工具实现代码的精简和变量名不可读化,并详细阐述源映射(source maps)的工作原理及其在生产环境中调试代码的关键作用,帮助开发者在优化代码的同时保持高效的开发体验。 在现代Web开发中,我…

    2025年12月21日
    000
  • React列表渲染深度解析:Props数据访问与Key属性的最佳实践

    本文深入探讨了react应用中列表渲染时常见的`props`数据访问问题及`key`属性的正确使用。文章详细解释了为何在异步数据加载场景下,子组件可能无法立即访问到父组件传递的数组元素,并强调了为列表项提供稳定、唯一`key`的重要性,以优化渲染性能和避免潜在的ui问题。 在React应用开发中,动…

    2025年12月21日 好文分享
    000
  • JavaScript函数式编程范式与实践

    函数式编程强调纯函数与不可变性,通过高阶函数和函数组合提升代码可读性与可维护性,建议在JavaScript中逐步应用其核心思想以减少副作用并增强测试性。 函数式编程在JavaScript中越来越受到重视,它提供了一种更清晰、可预测且易于测试的代码编写方式。虽然JavaScript不是纯函数式语言,但…

    2025年12月21日
    000
  • 使用JavaScript进行数据可视化(D3.js基础)_javascript数据可视化

    D3.js通过绑定数据到DOM元素实现网页数据可视化。首先引入库文件,使用d3.select()选择元素并绑定数据,结合.enter()生成对应元素;接着创建SVG容器绘制图形,如矩形柱状图;再利用d3.scaleLinear()定义比例尺将数据映射为像素坐标,并用d3.axisBottom()添加…

    2025年12月21日
    000
  • JavaScript中的异步编程与事件循环深度解析

    JavaScript通过事件循环实现异步非阻塞,核心为回调、Promise与async/await;执行时先同步代码,再微任务(如Promise),最后宏任务(如setTimeout),输出顺序体现调用栈与任务队列优先级。 JavaScript 是单线程语言,但它通过异步编程模型实现了高效的非阻塞操…

    2025年12月21日
    000
  • React保护路由:处理异步认证状态的渲染挑战

    ;一旦isLogin的值被确定为true或false,组件会重新渲染。如果isLogin为true,则渲染Protected组件的子组件(即受保护的页面内容)。如果isLogin为false,则使用Navigate组件重定向到根路径(通常是登录页)。replace属性: Navigate组件的rep…

    2025年12月21日
    000
  • JS实现一个完整的单页应用(SPA)_javascript实战

    答案:用原生 JavaScript 可实现 SPA,核心包括路由管理、视图切换、数据绑定和组件化。通过 History API 监听 URL 变化,定义路由表 routes,匹配路径并渲染对应内容;利用 popstate 事件处理浏览器前进后退;拦截 a 标签点击事件,调用 preventDefau…

    好文分享 2025年12月21日
    000
  • Node.js Express应用中高效内存缓存策略与实践

    本文旨在探讨node.js express应用中利用`setinterval`实现数据内存缓存的常见模式,分析其潜在的内存管理问题,并提供一套健壮、高效且易于维护的缓存策略。我们将通过优化代码结构、引入生命周期管理和内存监控,帮助开发者构建更稳定的服务。 在构建高性能的Node.js应用时,减少对数…

    2025年12月21日
    000
  • 理解JavaScript中的尾调用优化_javascript优化

    尾调用优化通过消除不必要的栈帧来减少内存消耗,当函数末尾调用另一函数并直接返回其结果时触发,如tailCallExample中递归调用自身且无后续操作,符合尾调用条件。 尾调用优化(Tail Call Optimization,简称TCO)是JavaScript中一项重要的性能优化机制,主要出现在E…

    2025年12月21日
    000
  • Web Workers多线程编程与性能优化

    Web Workers通过多线程机制提升性能,适用于计算密集型任务。主线程与Worker线程通过postMessage通信,Worker不可访问DOM。适用场景包括大数据处理、复杂计算等,优化建议有减少消息开销、复用实例、按需加载。高级用法支持SharedArrayBuffer实现内存共享,需注意安…

    2025年12月21日
    000
  • JS实现剪贴板复制功能的几种方式_javascript技巧

    答案:JavaScript实现剪贴板复制有三种主要方式。1. 使用已废弃但兼容性好的document.execCommand(“copy”),需创建临时文本元素并触发用户事件;2. 推荐使用现代Clipboard API的navigator.clipboard.writeTe…

    2025年12月21日
    000
  • 移动端混合开发框架原理

    混合开发框架通过WebView渲染Web界面并借助Bridge实现JS与原生通信,采用插件化扩展设备功能,在跨平台效率与用户体验间取得平衡。 移动端混合开发框架的核心在于结合原生应用与Web技术的优势,实现跨平台高效开发。它通过一个原生外壳(Native Container)加载Web页面,让开发者…

    2025年12月21日
    000
  • JavaScript模块联邦与微前端

    模块联邦是Webpack 5实现微前端的核心技术,允许应用在运行时动态共享组件与依赖,通过remotes和exposes配置实现跨应用加载,支持独立开发部署,需注意版本一致、加载容错与样式隔离,适用于多团队协作的大型项目。 模块联邦(Module Federation)是 Webpack 5 引入的…

    2025年12月21日
    000
  • 使用Service Worker实现离线应用_js PWA技术

    Service Worker 是 PWA 核心,通过注册、安装、激活流程实现离线访问;首先在页面加载时注册 sw.js,检查支持性;安装阶段预缓存关键资源如 HTML、CSS、JS 和图片,确保离线可用;通过 fetch 事件拦截请求,优先返回缓存内容,实现离线浏览;更新时通过更改缓存名称并清理旧缓…

    2025年12月21日
    000
  • JavaScript中的迭代器与生成器_javascript ES6

    迭代器是符合next()方法返回value和done的对象,生成器函数用function*定义并返回可迭代的生成器对象。 JavaScript中的迭代器和生成器是ES6引入的重要特性,它们让数据遍历和异步编程更加简洁高效。理解这两个概念有助于写出更清晰、更具可读性的代码。 什么是迭代器(Iterat…

    2025年12月21日
    000
  • JavaScript中的WebGL基础入门_javascript 3D图形

    首先获取WebGL上下文,然后编写并编译顶点和片段着色器,接着创建缓冲区传入顶点数据,最后调用drawArrays绘制三角形,完成基本渲染流程。 WebGL(Web Graphics Library)是一种在浏览器中渲染3D图形的技术,无需插件即可直接使用JavaScript操作GPU。它基于Ope…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信