顺序搜索

  1. Array.prototype.search = function (target) {
  2. for (let i = 0; i < this.length; i += 1) {
  3. if (this[i] === target) {
  4. return i;
  5. }
  6. }
  7. return -1;
  8. }
  9. const arr = [5, 4, 3, 2, 1];
  10. console.log(arr.search(0));

二分查找

二分查找需要数组是有序的,1、先从有序数组的最中间元素开始查找,如果和要查找的元素相等,直接返回索引,若不相等则下一步。2、如果指定的元素大于或者小于中间元素,则在大于或小于的那一半区域内查找,重复第一步直到找到目标元素。

不使用递归

  1. // 时间复杂度 O(logn) 空间复杂度为 O(1)
  2. function two_find(arr, val) {
  3. var min = 0;
  4. var max = arr.length - 1;
  5. var mid;
  6. while (min <= max) {
  7. mid = Math.floor((min + max) / 2);
  8. if (val === arr[mid]) {
  9. return mid;
  10. } else if (val < arr[mid]) {
  11. max = mid - 1;
  12. } else if (val > arr[mid]) {
  13. min = mid + 1;
  14. }
  15. }
  16. return -1;
  17. }
  18. console.log(two_find([1, 3, 6, 8, 9, 10], 3));
  19. console.log(two_find([1, 3, 6, 8, 9, 10], 5));
  20. console.log(two_find([1, 3, 6, 8, 9, 10], 8));

使用递归

  1. // 虽然使用递归的时间复杂度也为 O(logn),但是函数递归调用,会消耗内存,所以空间复杂度也为 O(logn)
  2. function two_find(arr, min, max, val) {
  3. if (min > max) {
  4. return -1;
  5. }
  6. var mid = Math.floor((min + max) / 2);
  7. if (val === arr[mid]) {
  8. return mid;
  9. } else if (val < arr[mid]) {
  10. max = mid - 1;
  11. return two_find(arr, min, max, val);
  12. } else if (val > arr[mid]) {
  13. min = mid + 1;
  14. return two_find(arr, min, max, val);
  15. }
  16. }
  17. console.log(two_find([1, 3, 6, 8, 9, 10], 0,8,3));
  18. console.log(two_find([1, 3, 6, 8, 9], 0,8,5));
  19. console.log(two_find([1, 3, 6, 8, 9], 0,8,6));

题目

猜数字大小

  • 使用二分查找

image.png

参考