检索算法

二分搜索

在计算机科学中,二分搜索(binary search),也称折半搜索(half-interval search)、对数搜索(logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

检索算法 - 图1

递归方式

  1. function binarySearch( arr, val, start, end ) {
  2. if ( arguments.length < 4 ) {
  3. start = 0;
  4. end = arr.length;
  5. }
  6. const copy = arr.slice(start, end);
  7. const len = copy.length;
  8. if ( len === 0 ) {
  9. return -1;
  10. }
  11. if ( len === 1 ) {
  12. return copy[0] === val ? start : -1;
  13. }
  14. const idx = Math.floor(len / 2) - 1;
  15. const mid = start + idx;
  16. const base = copy[idx];
  17. if ( val === base ) {
  18. return mid;
  19. }
  20. if ( val < base ) {
  21. end = mid;
  22. }
  23. else {
  24. start = mid + 1;
  25. }
  26. return binarySearch(arr, val, start, end);
  27. }

循环方式

  1. function binarySearch( arr, val ) {
  2. let start = 0;
  3. let end = arr.length - 1;
  4. while ( start <= end ) {
  5. const mid = Math.floor((start + end) / 2);
  6. const base = arr[mid];
  7. if ( base < val ) {
  8. start = mid + 1;
  9. }
  10. else if ( base > val ) {
  11. end = mid - 1;
  12. }
  13. else {
  14. return mid;
  15. }
  16. }
  17. return -1;
  18. }