java中合并排序的问题

2024-01-17

我是 stackoverflow 的新手,我需要一些帮助来编写一个程序来对可比数组列表进行合并排序。我已经在这段代码上工作了几个小时,但没有成功。该程序需要正确运行,因为我正在为计算机科学课程做它,而下一个作业要求我们测试不同类型的效率。这是代码:

合并方法:

public static void merge(ArrayList <Comparable> a, int first, int mid, int last){
    ArrayList <Comparable> b = new ArrayList();
    for(int k = first; k <= last; k++){
        b.add(a.get(k));
    }

    System.out.println("b now contains " + b);
    int middle =b.size() /2;
    for(int i = first; i <= last; i++){
        //System.out.println("mid: " + b.size() /2);
        //System.out.println("b: " + b);
        //System.out.println("a: " + a);
        //System.out.println("i: " + i);
        if(middle == b.size()){
            a.set(i, b.remove(0));
            middle--;
        }else if(middle == 0){
            a.set(0, b.remove(0));
        }else if(b.get(0).compareTo(b.get(middle)) < 0){
            System.out.println("moving " + b.get(0) + " from b[0] to a[" + 
                i + "] because " + b.get(0) + " is less than " + b.get(middle));
            a.set(i, b.remove(0));
            middle--;
            System.out.println("b now contains " + b);
        }else{
            System.out.println("moving " + b.get(middle) + " from b[" + 
                b.size() /2 + "] to a[" + i + "] because " + b.get(0) + 
                    " is greater than " + b.get(middle));
            a.set(i, b.remove(middle));
            //middle--;
            System.out.println("b now contains " + b);
        }
    }

    System.out.println();
    System.out.println("Merge");
    System.out.println(a);
    System.out.println();
}

归并排序方法:

public static void mergeSort(ArrayList <Comparable> a, int first, int last){
    if(first < last){
        int mid = first + (last - first) /2;
        System.out.println("mergeSorting " + a.subList(first, last + 1));
        mergeSort(a, first, mid);
        System.out.println("mergeSorting " + a.subList(first, mid + 1));
        mergeSort(a, mid + 1, last);
        System.out.println("merging " + a.subList(first, mid + 1) + 
            " and " + a.subList(mid + 1, last + 1));
        merge(a, first, mid, last);
    }
    System.out.println();
    System.out.println("base case");
    System.out.println();
}

我认为有一个问题merge方法,但我不确定。

我的代码似乎对列表进行了错误的排序,即:

Input:
[7,1,9,9,5,4,8,9,10,4] 

Output:
[4,8,9,4,10,10,5,9,9,7]

归并排序算法没问题。我刚刚定义了 ArrayList 的类型以避免警告

   public static void mergeSort(ArrayList <Comparable> a, int first, int last){
        if(first < last){
            int mid = first + (last - first) /2;
        //    System.out.println("mergeSorting " + a.subList(first, mid ));
            System.out.println("First"+first);
            System.out.println("Mid"+mid);
            System.out.println("Last"+last);
            System.out.println("MergeSortCall");
            System.out.println("firstVector " + a.subList(first, mid+1));
            System.out.println("secondVector " + a.subList(mid + 1,last+1));                
            mergeSort(a, first, mid);
            mergeSort(a, mid + 1, last);
            merge(a, first, mid, last);
            System.out.println("mergeVector " + a.subList(first,last+1));
        }

    }

第二部分确实很难确切地知道出了什么问题,所以我基本上使用您的符号将其替换为更简单的内容。请注意,第二部分只是一个“合并”算法。它应该非常简单。无论如何,使用这个你可以与你的结果进行比较(抱歉,很难理解第二部分的逻辑,这是你的作业,不是吗?)。我使用两个向量来提高可读性,但只需要像您一样的一个。

public static void merge(ArrayList <Comparable> a, int first, int mid, int last){
            ArrayList <Comparable> vectorFirst = new ArrayList<Comparable>();
            ArrayList <Comparable> vectorSecond = new ArrayList<Comparable>();

            for(int k=first;k<=mid;k++){
                vectorFirst.add(a.get(k));
            }
            for(int k=mid+1;k<=last;k++){
                vectorSecond.add(a.get(k));
            }

            int i=first;
            int j=mid+1;
            int k=first-1;
            while((i<=mid)&(j<=last)){
                if(vectorFirst.get(i-first).compareTo(vectorSecond.get(j-mid-1))==-1){
                    k=k+1;
                    a.set(k,vectorFirst.get(i-first));
                    i=i+1;
                }
                else{
                     k=k+1;
                     a.set(k,vectorSecond.get(j-mid-1));
                     j=j+1;
                }
            }
            if(i==mid+1){
                while(j<=last){
                    k=k+1;
                    a.set(k,vectorSecond.get(j-mid-1));
                    j=j+1;
                }
            }
            else{
                while(i<=mid){
                    k=k+1;
                    a.set(k,vectorFirst.get(i-first));
                    i=i+1;
                }
            }


        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中合并排序的问题 的相关文章

  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • 如何在 Openfire 中使用 smack

    你好 我计划开发一个可以连接到 gtalk facebook 等的聊天客户端 我决定将 smack API 与 openfire 一起使用 但我需要很少的指导来了解如何将它与 openfire 服务器一起使用 openfire 是否提供了基
  • 如何强制jar使用(或jar运行的jvm)utf-8而不是系统的默认编码

    我的Windows默认编码是GBK 而我的Eclipse完全是utf 8编码 因此 在我的 Eclipse 中运行良好的应用程序崩溃了 因为导出为 jar 文件时这些单词变得不可读 我必须在 bat 文件中写入以下行才能运行该应用程序 st
  • Spring数据中的本机查询连接

    我有课 Entity public class User Id Long id String name ManyToMany List
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从休眠乐观锁定异常中恢复

    我有一个这样的方法 Transactional propagation Propagation REQUIRES NEW public void doSomeWork Entity entity dao loadEntity do some
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 使用 Java https 上传到 Imgur v3 错误

    我目前正在尝试使用他们当前的 API v3 上传到 imgur 但是我不断收到错误 错误 javax net ssl SSLException 证书中的主机名不匹配 api imgur com imgur com OR imgur com
  • 使用 JFreeChart 为两个系列设置不同的 y 轴

    我正在使用 JFreeChart 使用折线图绘制两个数据系列 XYSeries 复杂的因素是 其中一个数据系列的 y 值通常远高于第二个数据系列的 y 值 假设第一个系列的 y 值约为数百万数量级 而第二个数据系列的 y 值约为数百万数量级
  • ArrayList.clear() 和 ArrayList.removeAll() 有什么区别?

    假如说arraylist定义为ArrayList
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • VS 2013 看不到我的自定义签入策略

    我有通过 VSIX 部署的自定义签入策略 现在我尝试在 Visual Studio 2013 中使用它们 我做了什么 我在 VS 2013 中打开了我的策略 将 vsixmanifest 中的 安装目标 更改为 10 0 13 0 然后构建
  • Azure Devops yaml 部署管道显示不需要的消息/描述

    最近 我从传统的图形部署管道迁移到可重用的 yaml 构建和部署管道 yaml 构建管道正在交付在部署管道中使用的 多个 工件 运行部署管道 使用参数和设置 yaml 模板等时 我看到 当管道完成后 会有如下描述 由于部署管道与构建管道不在
  • 集成测试中访问内存dbcontext

    如何在集成测试中访问内存数据库的 dbcontext 我已经按照这里的代码进行操作 https learn microsoft com en us aspnet core test integration tests view aspnet
  • 将现有表上的 newid() 更改为 newsequentialid()

    目前 我们有许多表在主键上使用 newid 这导致了大量的碎片 所以我想更改该列以使用 newsequentialid 代替 我认为现有数据仍将保持相当分散 但新数据的分散程度将减少 这意味着我也许应该等待一段时间 然后再将 PK 索引从非
  • 如何从基类的实例创建派生类的实例并包含私有字段?

    我的问题有点与这个问题 https stackoverflow com questions 25163478 create an instance of derived class from the base class但更具体一点 我有一
  • Hibernate 的 org.hibernate.hql.ast.QuerySyntaxException

    我刚开始使用 Hibernate 和 Java 我收到以下异常 我在网上找到的有关此错误的内容似乎没有帮助 有任何想法吗 例外情况 java lang IllegalArgumentException org hibernate hql a
  • 从 DB2 转储 SQL

    我正在尝试将一台 IBM DB2 UDB 服务器中特定模式的内容转储到 sql 文本文件中 很像 mysql 的 mysqldump 功能 我遇到了 db2look 但它只转储模式的结构 只有 ddl 没有 dml 那么我怎样才能完成我的事
  • 从连接列创建虚拟矩阵[重复]

    这个问题在这里已经有答案了 我正在使用 R 并且我有一个如下所示的列 relative aunt mother grandmother sister mother 我想要的结果应该是这样的 mother sister aunt grandm
  • InstanceDouble(session) (匿名)> 收到意外消息 :[]= with

    我对 rspec 行为有疑问 我尝试为我使用的服务编写测试session 用于读取一些值并覆盖该值 例如我想测试什么 class CurrentCartService attr reader user session def initial
  • Android:CollapsingToolbarLayout 中的 MapView

    我目前正在尝试放置一个Map View 或包含地图的片段 内CollapsingToolbarLayout 我想在它上有视差效果RecyclerView卷轴 不幸的是 它根本没有出现 连灰色网格都没有 不过 折叠动画正在发挥作用 我到处寻找
  • 来自队列的大对象堆和字符串对象

    我有一个 Windows 控制台应用程序 应该可以运行数天和数月而无需重新启动 该应用程序从 MSMQ 检索 工作 并对其进行处理 有 30 个线程同时处理一个工作块 来自 MSMQ 的每个工作块大约为 200kb 其中大部分分配在单个 S
  • C# - 迭代谓词的模式

    我做了一个我不太喜欢的图案 如下 List
  • Javafx css按钮图形调整大小[重复]

    这个问题在这里已经有答案了 我想更改按钮内图标的大小 图像的尺寸为 512 x 512 我想调整为 16x16 那么 使用 javaFX CSS 实现此目的的最佳方法是什么 这是我到目前为止所做的 btnCancel button fx g
  • 将数据文件添加到 cmake 生成的项目中

    我有一个项目 其中源文件位于 source 中 一些着色器文件位于 data 中 这些文件未编译 而是由代码加载 我希望这些文件显示在我的 CMake 生成的 VS2010 项目文件中 以便我可以轻松地编辑它们 有什么好的方法可以做到这一点
  • 在 XNA 中使用 HTML/CSS 作为 UI?

    有没有办法使用 HTML CSS 来做 XNA 游戏的用户界面 我需要以编程方式更新 HTML 以及处理事件 或者我应该使用另一个框架 该线程看起来很有希望 XNA 的 UI 库 https stackoverflow com questi
  • 将 int 列表传递给 HttpGet 请求

    我有一个结构与此类似的函数 HttpGet public HttpResponseMessage GetValuesForList List
  • java.io.IOException:无效的 Http 响应

    现在 在你说有这样的问题之前 我想指出我已经浏览了其中的大多数问题 但没有任何运气 另外 我是第一次来这里 所以要温柔 我现在在当前的程序中遇到了这个烦恼 基本上我的程序的这一部分使用搜索引擎来查找 torrent 文件 public st
  • 如何建立自己的PEAR频道?

    我正在寻找有关如何为我们的项目设置 PEAR 通道的说明 以便我们可以使用 pear 安装程序来部署它 我在网上搜索了一段时间 找不到任何简单的信息 我跟着本教程 http greg chiaraquartet net archives 1
  • 隐藏或显示子报表

    我有一个要求 需要显示或隐藏子报告基于用户选择 假设我有一个主报告和两个子报告 sub1 and sub2 用户选择仅显示sub1 布尔值将通过Java 我需要显示主要报告sub1并隐藏在其中sub2 I tried
  • java中合并排序的问题

    我是 stackoverflow 的新手 我需要一些帮助来编写一个程序来对可比数组列表进行合并排序 我已经在这段代码上工作了几个小时 但没有成功 该程序需要正确运行 因为我正在为计算机科学课程做它 而下一个作业要求我们测试不同类型的效率 这