我在Java脚本和Golang中有一个合并排序实现.它在Golang中运行正常,然而,在Java中,它似乎总是被关闭1.我没有发现任何明显的错误.如果能有任何关于它失败的原因的见解,我将不胜感激

我试过了:

  • for迭代更改为从leftStart开始
  • 将中间元素从Math.floor更改为Math.ceilMath.round
  • start合并到middle-1,从middle合并到end
function mergeSort(arr) {
  merge(arr, 0, arr.length - 1, []);
}

function merge(arr, start, end, temp) {
  if (start >= end) {
    return;
  }
  const middle = Math.floor((start + end) / 2);
  merge(arr, start, middle, temp);
  merge(arr, middle + 1, end, temp);
  mergeHalves(arr, start, end, temp);
}

function mergeHalves(arr, leftStart, rightEnd, temp) {
  const leftEnd = Math.floor((leftStart + rightEnd) / 2);
  const rightStart = leftEnd + 1;
  const size = rightEnd - leftStart + 1;

  let left = leftStart;
  let right = rightStart;
  let index = left;

  while (left <= leftEnd && right <= rightEnd) {
    if (arr[left] <= arr[right]) {
      temp[index] = arr[left];
      left++;
    } else {
      temp[index] = arr[right];
      right++;
    }
    index++;
  }

  while (left <= leftEnd) {
    temp[index] = arr[left];
    index++;
    left++;
  }

  while (right <= rightEnd) {
    temp[index] = arr[right];
    index++;
    right++;
  }

  for (let i = 0; i < size; i++) {
    arr[i] = temp[i];
  }
}

测试用例:

    const arr = [2, 1, 3, 5, 6, 2, 7];
    mergeSort(arr);
    //coming back as [1, 2, 3, 5, 6, 2, 7]
    expect(arr).toEqual([1, 2, 2, 3, 5, 6, 7]);

推荐答案

问题出在这个循环中:

for (let i = 0; i < size; i++) {
    arr[i] = temp[i];
}

这在两个方面是错误的:

  • 这会为arr[0..size-1]中的元素赋值,但这通常不是这里合并的范围.它应该以arr[leftStart..rightEnd]为目标.

  • temp也没有收集从索引0开始的值.然而,这样做更合乎逻辑,因此应该在该函数的早期阶段修复index的初始化方式.

以下是更正后的行:

    let index = 0; // not leftStart!
    /* 
        ... the rest of your code ... 
        and finally:
    */
    for (let i = 0; i < size; i++) {
        arr[leftStart + i] = temp[i];
    }

Javascript相关问答推荐

我应该在redux reducer中调用其他reducer函数吗?

为什么ngModel不能在最后一个版本的Angular 17上工作?'

我们如何从一个行动中分派行动

当点击注册页面上的注册按钮时,邮箱重复

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

为什么这个.add.group({})在教程中运行得很好,但在我的游戏中就不行了?

我想将Sitecore搜索面过滤器从多个转换为单个

当代码另有说明时,随机放置的圆圈有时会从画布上消失

当从其他文件创建类实例时,为什么工作线程不工作?

如何使用[ModelJSON,ArrayBuffer]调用tf.loadGraphModelSync

我的NavLink活动类在REACT-ROUTER-V6中出现问题

连续添加promise 时,如何在所有promise 都已结算时解除加载覆盖

有角粘桌盒阴影

不允许在对象文本中注释掉的属性

观察子组件中的@Output事件emits 器?

Js问题:有没有办法将数据从标记表转换成图表?

使用重新 Select 和对象理解 Select 器备忘

如何判断字符串是否只包含特定字符串

App Script如何读取通过云函数传递的表单对象

.Remove()函数不适用于MongoDB