【问题标题】:Code to find position of number inside sorted array after selection sort isn't stable?选择排序后在排序数组中查找数字位置的代码不稳定?
【发布时间】:2017-05-17 15:16:08
【问题描述】:

此代码在插入另一个元素后对数组进行排序,并返回已插入元素在排序数组中的索引(需要返回第一个位置或可能的最低索引)。

代码:

function getIndexToIns(arr, num) {
  // Find my place in this sorted array.
  var sortedarr = sort(combinelists(arr, num).sort());
  var pos = [];
  for (i = 0; i < sortedarr.length; i++) {
    if (sortedarr[i] == num) {
      pos.push(i);
    }
  }
  return pos[0];
}

function combinelists(arr1, arr2) {
  var newarr = [];
  newarr.push(arr2);
  for (i = 0; i < arr1.length; i++) {
    newarr.push(arr1[i]);
  }
  return newarr;
}

function sort(arr) {
  if (arr.length < 2) {
    return arr;
  } else {
    var l = arr.length / 2;
    var leftarr = arr.slice(0, l);
    var rightarr = arr.slice(l);
    return combine(sort(leftarr), sort(rightarr));
  }
}

function combine(array, another_array) {
  var result = [];
  while (array.length && another_array.length) {
    if (array[0].age <= another_array[0].age) {
      result.push(array.shift());
    } else {
      result.push(another_array.shift());
    }
  }

  while (array.length)
    result.push(array.shift());

  while (another_array.length)
    result.push(another_array.shift());
  return result;
}

console.log(getIndexToIns([2, 20, 10], 19));
console.log(getIndexToIns([2, 5, 10], 15));

但它似乎不适用于所有输入:

It works for the following tests: 
[10, 20, 30, 40, 50], 30
[40, 60], 50
[2, 20, 10], 19

But it doesn't work for these:
[2, 5, 10], 15
[5, 3, 20, 3], 5
[3, 10, 5], 3
[10, 20, 30, 40, 50], 35

什么坏了?

【问题讨论】:

  • 你真的有问题吗?
  • 天哪,是的,我有一个问题 - 为什么它对某些人有效,而对其他人无效?顺便说一句,“如果它没有通过所有的测试,它就没有准备好进行代码审查”。所以,是的..
  • 那段代码看起来很复杂
  • 我也是这么想的。无论如何,结果证明简单地使用 .sort() 比构建自己的要好。不管怎样,一切都很有趣。 'ta'ta..

标签: javascript arrays sorting indexof selection-sort


【解决方案1】:

你使用Array#sort() 而不使用compareFunction,这意味着你得到的结果是每个元素都被视为字符串而不是数字。这可能导致错误的索引。

var sortedarr = sort(combinelists(arr,num).sort());
//                                         ^^^^^^

你可以使用像这样的回调

var sortedarr = sort(combinelists(arr,num).sort(function (a, b) { return a - b; }));

用于按数字排序。

【讨论】:

  • 好吧,我不确定你是否抓住了它,但是我创建的排序算法似乎与Array#sort() 混淆了。我断开了选择排序并恢复为简单的.sort(...). 它可以工作。无论如何我都会接受你的回答,因为它毕竟引导我走上正确的道路。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
相关资源
最近更新 更多