הרעיון

תנאי מקדים: המערך חייב להיות ממוין (בסדר עולה).

  1. הגדר low = 0 ו-high = length - 1.
  2. חשב mid = (low + high) / 2.
  3. אם arr[mid] == key – מצאנו! מחזירים mid.
  4. אם arr[mid] < key – הערך בחצי הימני: low = mid + 1.
  5. אם arr[mid] > key – הערך בחצי השמאלי: high = mid - 1.
  6. חוזרים ל-2 כל עוד low ≤ high.

דוגמה מצוירת

חיפוש הערך 23 במערך {2, 5, 8, 12, 16, 23, 38, 56, 72, 91}:

שלבlowhighmidarr[mid]החלטה
10941616 < 23 → low = 5
25975656 > 23 → high = 6
35652323 == 23 → נמצא!

מצאנו את 23 באינדקס 5 תוך 3 צעדים בלבד (במקום עד 10 בחיפוש לינארי).

קוד – חיפוש בינארי איטרטיבי

public static int binarySearch(int[] arr, int key) {
    int low = 0;
    int high = arr.length - 1;

    while (low <= high) {
        int mid = (low + high) / 2;

        if (arr[mid] == key)
            return mid;
        else if (arr[mid] < key)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return -1; // לא נמצא
}

קוד – חיפוש בינארי רקורסיבי

public static int binarySearchRec(int[] arr, int key, int low, int high) {
    if (low > high)
        return -1;

    int mid = (low + high) / 2;

    if (arr[mid] == key)
        return mid;
    else if (arr[mid] < key)
        return binarySearchRec(arr, key, mid + 1, high);
    else
        return binarySearchRec(arr, key, low, mid - 1);
}

קריאה: binarySearchRec(arr, key, 0, arr.length - 1)

סיבוכיות

מקרהסיבוכיותהסבר
מקרה טובO(1)הערך בדיוק באמצע
מקרה גרועO(log₂ n)מחצים את הטווח עד שנשאר איבר אחד

דוגמאות מספריות

גודל מערך (n)צעדים מקסימליים
104
1007
1,00010
1,000,00020

השוואה – לינארי מול בינארי

חיפוש לינאריחיפוש בינארי
סיבוכיותO(n)O(log n)
דורש מיוןלאכן
פשטותפשוט מאודמורכב יותר
מתאים ל...מערכים קטנים / לא ממויניםמערכים גדולים וממוינים

שאלות נפוצות

מה קורה אם המערך לא ממוין?

חיפוש בינארי לא יעבוד נכון על מערך לא ממוין. התוצאה עלולה להיות שגויה. חובה למיין לפני החיפוש.

למה low <= high ולא low < high?

כי יכול להיות שהערך נמצא כשנשאר בדיוק איבר אחד (low == high). אם נכתוב < במקום <= נפספס את האיבר הזה.

למה mid = (low + high) / 2?

זה האינדקס האמצעי בין low ל-high. חילוק שלמים ב-Java מעגל כלפי מטה. שימו לב: עבור מערכים ענקיים (בלי קשר לבגרות), עדיף low + (high - low) / 2 כדי למנוע גלישה.

צריכים עזרה באלגוריתמים?

מורים פרטיים ילמדו אתכם חיפוש, מיון ואלגוריתמיקה לבגרות.

מצאו מורה פרטי