确定插入索引

时间:2016-04-28 10:21:38

标签: javascript algorithm binary-search

决定使用二分查找插入元素的位置的关键点是什么?

当元素存在时使用二分搜索返回其索引。

function arr() {
  this.arr = [5, 6, 8];
  this.insert = function(element) {
    var low = 0;
    var high = this.arr.length - 1;
    while (low <= high) {

      var mid = parseInt((low + high) / 2);
      if (element == this.arr[mid]) {
        return mid;
      } else if (element > this.arr[mid]) {
        low = mid + 1;
      } else {
        high = mid - 1
      }
    }
    return -1
  }
}
var vector = new arr();
var x = vector.insert(6); // return 1
alert(x)

这里我可以使用splice在索引1上插入元素,但是如果做什么

var x = vector.insert(7);

7不存在于数组中,但应插入第2个索引。

我怎么能确定?

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

function arr() {
  this.arr = [5, 6, 8];
  this.insert = function(element) {
    var low = 0;
    var high = this.arr.length - 1;
    while (low <= high) {

      var mid = parseInt((low + high) / 2);
      if (element == this.arr[mid]) {
        return mid;
      } else if (element > this.arr[mid]) {
        low = mid + 1;
      } else {
        high = mid - 1
      }
    }
    return mid;
  }
}

答案 1 :(得分:1)

如果元素未在数组中找到,则可能需要使用splice()插入元素。我还对你的代码进行了少量编辑。

插入索引由您的mid变量确定。

&#13;
&#13;
    function arr() {
      this.arr = [5, 6, 8];
      this.insert = function(element) {
        var low = 0;
        var high = this.arr.length;
        while (low <= high) {

          var mid = Math.floor((low + high) / 2);
          if (element == this.arr[mid]) {
            return mid;
          } else if (element > this.arr[mid]) {
            low = mid + 1;
          } else {
            high = mid - 1;
          }
        }
        this.arr.splice(mid, 0, element);
        return mid;
      }
    }

    var vector = new arr();

    var x = vector.insert(6);
    console.log(x); // 1

    var x = vector.insert(7);
    console.log(x); // 2

    var x = vector.insert(9);
    console.log(x); // 4

    console.log(vector.arr); // Array [ 5, 6, 7, 8, 9 ]

    document.write('<p>Check your console :-)</p>');
&#13;
&#13;
&#13;

答案 2 :(得分:1)

当找不到项目时,某些二进制搜索实现会返回插入点的一个补码。在您的情况下,如果找到该项目,则将在索引2处插入该项目。但由于没有找到,你返回-3。调用者看到返回值小于0,做一个补码,然后插入该位置。

示例:

result = find(7)      // find the value in the array
if (result < 0)       // if not found
{
    index = ~result   // complement the result
    insert(7, index)  // and insert (probably using splice)
}

在您的代码中,而不是return -1,执行return ~mid

使用一个补码而不是负索引的原因是,如果您要查找的项目小于数组中的最小项目,则必须在索引0处插入。但如果您返回 - 0,你得到...... 0.所以不可能分辨出在零处找到的项目与需要在索引0处插入的项目之间的区别。一个补码解决了这个问题,因为0的补码是-1