二进制搜索查找Magic Index

时间:2017-04-04 03:52:09

标签: javascript arrays algorithm

我正在练习二元搜索,并且在尝试实现二进制搜索时,我会碰壁,以找到"魔法索引"在数组中。神奇的索引是O(n)

我在Java using recursion中找到了一些实现,但是我试图避免递归这样做,因为递归很昂贵(我想看看这里是否适合二进制搜索)。

这是我的代码:

A[i] == i

问题是算法在某些测试运行时错误地将数组切片到错误的一侧。

例如,function magicIndex(arr) { var result = arr, mid; while (result.length > 1) { mid = Math.floor(result.length / 2); if (result[mid] === mid) { return arr.indexOf(result[mid]); } else if (mid > result[mid]) { result = result.slice(mid+1, result.length); } else { result = result.slice(0, mid); } } return arr.indexOf(result.pop()); } 会返回[-10, -3, 0, 2, 4, 8],但4也会返回[-10, 1, 0, 2, 5, 8]

2 个答案:

答案 0 :(得分:3)

您的第二个数组未排序,binary search仅适用于已排序的数组。

答案 1 :(得分:0)

既然你正在练习,我认为你自己编码很好,但我会给你一个指导。

使用此算法(请注意,输入数组应已经排序,否则实现排序方法):

  int arr[n];
  K ← 1; //search key
  l ← 0; r ← n - 1;
  while l ≤ r do
      m ← floor((l + r)/2)
      if K = arr[m]
          return m
      else if K < arr[m]
          r ← m − 1
      else
          l ← m + 1
  return −1

这将输出搜索键的索引,如果找不到键,则输出-1。