【问题标题】:Insertion Sort Function Error插入排序函数错误
【发布时间】:2017-08-15 05:36:25
【问题描述】:

为了做到这一点,插入函数需要通过将大于 value 的项目向右移动来为 value 腾出空间。它应该从 rightIndex 开始,并在找到小于或等于 value 的项或到达数组开头时停止。一旦函数为值腾出空间,它就可以将值写入数组。

var insert = function(array, rightIndex, value) {
    var key = value;
    for(var i = rightIndex; array[i] > value ; i = i - 1)
    {
        array[rightIndex + 1] = array[rightIndex];
    }
    array[i+1] = value;
};

为什么我输入这个数组后这个函数不能正常工作!

var array = [3, 5, 7, 11, 13, 2, 9, 6];

它显示了这个结果:

insert(array, 4, 2);

2,5,7,11,13,13,9,6

【问题讨论】:

  • 你想达到什么目的?
  • 请点击<>并创建minimal reproducible example
  • 2, 3, 5, 7, 11, 13, 9, 6 我要这个答案,问题完全清楚
  • 我也不清楚。请更新预期和实际并创建一个有效的 sn-p
  • 嗯,你所有的断言都通过了吗?这是错误发生,我的代码执行插入排序算法但这里有问题

标签: javascript arrays insertion-sort


【解决方案1】:

将项目向右移动的行需要编辑

更改当前显示的行:

array[rightIndex + 1] = array[rightIndex];

如下:

array[i + 1] = array[i];

在您当前编写的代码中,rightIndex'th 项被重复粘贴到rightIndex+1'th 位置。这就是为什么您的结果中有两个 13s。

所以你的代码几乎已经是正确的了!

显式检查数组的开头

您可以更改 for 循环以确保您永远不会离开数组的开头。

for(var i = rightIndex; i>=0 && array[i] > value ; i = i - 1)

插入i>=0 && 意味着当i 低于0 时,Javascript 知道结束循环。否则它将尝试读取未定义的元素array[-1]。幸运的是,测试仍然有效,因为任何数字(甚至是负数)与“未定义”的比较都是错误的。但是,明确地对此进行测试而不是依赖于语言的怪癖要好得多。原因是如果您在另一种语言中应用相同的算法,array[-1] 可能是一个错误。

【讨论】:

  • 数组[rightIndex + 1] = 数组[rightIndex];和上面一样
  • 您可以明确检查您是否位于数组的开头,而不是依赖数组在负索引处的未定义值吗?是的,它有效,但是这条线出现了,它说的是什么
  • @MuhammadHamza - 当你说Its the same as above 是,但array[i + 1] = array[i]; 不是 - 并且这种变化会产生你预期的输出
  • 如何明确检查我是否在数组的开头?而不是在负索引处依赖数组的未定义值?怎么样?
  • for(var i = rightIndex; i>0 && array[i] > value ; i = i - 1) 我输入了这一行,但是错误依旧
【解决方案2】:

将值插入数组可以正常使用已排序的数组,在这种情况下,您的数组未排序。

var array = [3, 5, 7, 11, 13, 2, 9, 6];

你需要先对数组进行排序,为此使用这个

var array = [3, 5, 7, 11, 13, 2, 9, 6];

array = arra.sort(function (a, b) {  return a - b;  });

array = array.sort((a, b) => a - b);

//outputs:  2, 3, 5, 6 , 7, 9, 11, 13

然后你可以按排序插入到这个数组中

为此,您可以尝试类似的方法

var array = [2, 3, 5, 6 , 7, 9, 11, 13];
var element = 2;

function insert(element, array) {
   array.push(element);

   array.sort(function(a, b) {
       return a - b;
   });

   return array;
}


//outputs:  2, 2, 3, 5, 6 , 7, 9, 11, 13

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多