如何解决有人可以编码并解释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 举报,一经查实,本站将立刻删除。