• 检索算法
    • 二分搜索
      • 递归方式
      • 循环方式

    检索算法

    二分搜索

    在计算机科学中,二分搜索(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. }