有人可以编码并解释mergesort的合并部分吗?

如何解决有人可以编码并解释mergesort的合并部分吗?

几个小时以来,我一直在试图了解mergesort的合并部分,并且我查看了许多教程和演练。而且我不了解mergesort的合并部分。从理论上讲,我理解这一点。但是,尝试通过代码实现它是Im遇到困难的地方。好像我不了解它的任何合并部分。我明白为什么您需要几个指针来跟踪while循环中条件语句背后的索引和推理。但是之后,我被卡住了。我在merge方法中写了一条关于im卡住位置的注释。如果有人可以向我解释我需要用Java编写代码以及其背后的原因,那将很棒。

编辑:添加了两个新的while循环合并方法。我认为剩下要做的就是如何将已排序的分区复制到input数组中。我认为之后应该可以正常工作了……

EDIT2:没关系,我只是看到它没有正确排序。希望有人可以修改我的代码并解释其中的过程

    public static void merge(int[] input,int start,int mid,int end) {
        if (input[mid - 1] <= input[mid]) {
            return;
        }
        int i = start;
        int j = mid;
        int tempIndex = 0;

        int[] temp = new int[end - start];
        
        //If i is greater than mid or j is greater than end,that means that half of the array is sorted
        while (i < mid && j < end) {
            temp[tempIndex++] = input[i] <= input[j] ? input[i++] : input[j++];
        }
        //added the two loops below
        while(i < mid){
            temp[tempIndex++] = input[i++];
        }
        while(j < end){
            temp[tempIndex++] = input[j++];
        }
        
    }
    ```

解决方法

MergeSort是一种分而治之的策略。

假设您有8个元素。

  • 这8个元素分别分成4个元素(左/右),并在每个元素上调用mergeSort。我们暂时将忽略合并,并进行更深入的研究。
  • 将这4个元素进一步拆分为2个元素,并在2个元素数组上调用mergeSort。
  • 将2个元素进一步拆分为1个元素,并在此时对每个元素调用mergeSort,它不执行任何操作即可返回。
  • 因此,我们终于在第一次调用merge了。那么合并有什么作用?合并加入2个已排序列表。当它们各自为1个元素时,只需选择一个就可以了。因此,让我们跳到这4个元素,并在下面提供一个示例:

当4元素子列表调用合并时,它可能具有以下内容:

1 3 2 4

每个子数组(1、3)和(2、4)已经通过上一个合并进行了排序。因此,我们现在需要在合并数组的同时对数组进行排序(我将使用一个单独的输出数组来演示应该发生什么,但是可以就地完成):

for (int i = 0,j = 2,k = 0; k < 4; k++)
{
    int idx;
    if ((j >= 4) || (i < 2 && inputArray[i] < inputArray[j]))
    {
        idx = i++;
    }
    else // j < 4 && (i > 2 || inputArray[j] < inputArray[i])
    {
        idx = j++;
    }
    outputArray[k] = inputArray[idx];
}

如您所见,最初我们将i指向1,将j指向2。因为1

合并之后,它将在具有2个4元素面的较大数组上调用,重复上面的过程。

下面是没有硬编码的通用代码

        public void Merge(int[] input,int start,int mid,int end)
        {
            if (input[mid - 1] <= input[mid])
            {
            }
            else
            {
                int[] tmp = new int[end - start];
                for (int i = start,j = mid,k = 0; k < tmp.Length; k++)
                {
                    int idx;
                    if ((j >= end) || (i < mid && input[i] < input[j]))
                    {
                        idx = i++;
                    }
                    else // j < end && (i > mid || inputArray[j] < inputArray[i])
                    {
                        idx = j++;
                    }
                    tmp[k] = input[idx];
                }

                for (int i = start,j = 0; i < end; i++,j++)
                {
                    input[i] = tmp[j];
                }
            }
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-