Menu
Coddy logo textTech

Bubble Sort (מיון בועות)

עודכן לאחרונה

מיון בועות עובר שוב ושוב על הרשימה, משווה כל זוג איברים סמוכים ומחליף ביניהם אם הם בסדר הלא נכון. אחרי כל מעבר מלא, הערך הגדול ביותר שנותר "מבעבע" למקומו הנכון בסוף, ולכן כל מעבר בודק איבר אחד פחות. לחצו על הפעלה למעלה כדי לראות את ההשוואות וההחלפות, או עברו עליהן אחת אחת.

זה אחד מאלגוריתמי המיון הפשוטים ביותר להבנה, ולכן הוא אלגוריתם ראשון מצוין, אבל זמן הריצה שלו, O(n²), הופך אותו ללא מעשי עבור קלטים גדולים.

סיבוכיות זמן וזיכרון

מקרהסיבוכיותהערות
המקרה הטובO(n)כבר ממוין, עם בדיקת יציאה מוקדמת
המקרה הממוצעO(n²)סדר אקראי
המקרה הגרועO(n²)ממוין בסדר הפוך
זיכרוןO(1)במקום, רק משתנה זמני אחד
יציבכןאיברים שווים שומרים על הסדר היחסי שלהם

צעד אחר צעד

צעדמה קורה
1מתחילים בתחילת המערך.
2משווים את האיבר הנוכחי לאיבר הבא.
3אם הם לא בסדר, מחליפים ביניהם.
4זזים מקום אחד ימינה וחוזרים על כך עד הסוף (מעבר אחד).
5חוזרים על המעברים; כל מעבר מקבע עוד איבר אחד בסוף.
6עוצרים כשמעבר מלא לא מבצע אף החלפה.

דוגמה מפורטת

מיון של [5, 2, 4, 1]:

מעברמערךפעולה
1[2, 4, 1, 5]מחליפים 5,2, אחר כך 5,4, ואז 5,1; 5 מבעבע לסוף.
2[2, 1, 4, 5]2,4 בסדר; מחליפים 4,1; 4,5 בסדר; 4 נמצא עכשיו במקומו.
3[1, 2, 4, 5]מחליפים 2,1; השאר כבר בסדר; 2 במקומו.
4[1, 2, 4, 5]מעבר מלא לא מבצע אף החלפה, ולכן המערך ממוין והאלגוריתם עוצר.

מתי להשתמש במיון בועות

השתמשו בו כאשרהימנעו ממנו כאשר
מלמדים או לומדים איך עובדים מיונים מבוססי השוואהממיינים קלטים גדולים, שבהם O(n²) איטי מדי
הקלט זעיר או כמעט ממוין (עם יציאה מוקדמת הוא מתקרב ל-O(n))אתם צריכים את המיון הכללי המהיר ביותר: השתמשו ב-quicksort או במיון מיזוג
אתם צריכים מיון יציב במקום עם כמעט אפס קודהנתונים בסדר אקראי והביצועים חשובים
רוצים לבדוק במעבר אחד אם רשימה קצרה כבר ממוינתכתיבות רבות יקרות (למשל זיכרון פלאש); מיון בחירה מבצע פחות החלפות

קוד Bubble Sort

מימוש נקי של Bubble Sort שאפשר להריץ, ב-Python, JavaScript, Java, C++, C, Pseudocode. בחרו שפה, העתיקו את הקוד, או פתחו אותו טעון מראש בעורך האונליין של Coddy.

קוד Bubble Sort ב-Python

Python
1def bubble_sort(a):2    n = len(a)3    for i in range(n - 1):4        swapped = False5        for j in range(n - 1 - i):6            if a[j] > a[j + 1]:7                a[j], a[j + 1] = a[j + 1], a[j]8                swapped = True9        if not swapped:10            break  # no swaps means the list is already sorted11    return a12
13
14nums = [5, 1, 4, 2, 8]15print("Before:", nums)16bubble_sort(nums)17print("After: ", nums)
להריץ את הקוד הזה בעורך ה-Python אונליין

שאלות נפוצות על מיון בועות

מהי סיבוכיות הזמן של מיון בועות?
מיון בועות רץ בזמן O(n²) במקרה הממוצע ובמקרה הגרוע בגלל הלולאות המקוננות. עם אופטימיזציה של יציאה מוקדמת הוא יכול להגיע ל-O(n) על מערך שכבר ממוין. הוא משתמש ב-O(1) זיכרון נוסף.
האם מיון בועות יציב?
כן. מיון בועות מחליף איברים סמוכים רק כשהם ממש לא בסדר, ולכן איברים שווים אף פעם לא עוקפים זה את זה ושומרים על הסדר היחסי המקורי שלהם.
למה קוראים לו מיון בועות?
בכל מעבר, הערך הלא ממוין הגדול ביותר זז צעד אחר צעד לכיוון סוף המערך, כמו בועה שעולה אל פני המים, ומכאן השם מיון "בועות".
מה ההבדל בין מיון בועות למיון הכנסה?
שניהם רצים ב-O(n²), יציבים ועובדים במקום, אבל הם מזיזים נתונים בצורה שונה: מיון בועות מחליף שוב ושוב זוגות סמוכים שאינם בסדר, ואילו מיון הכנסה לוקח כל איבר ומחליק אותו אחורה למקומו הנכון בחלק הממוין. מיון הכנסה בדרך כלל מבצע פחות כתיבות ורץ מהר יותר בפועל, במיוחד על נתונים כמעט ממוינים.
מתי כדאי להשתמש במיון בועות במקום ב-quicksort?
כמעט אף פעם בעבודה אמיתית: זמן הממוצע O(n log n) של quicksort מוחץ את O(n²) של מיון בועות בכל קלט שאינו זעיר. מיון בועות שווה בחירה רק כשהרשימה קטנה מאוד או כמעט ממוינת, או כשרוצים את המיון היציב הפשוט ביותר האפשרי לצורכי לימוד.
האם אופטימיזציית היציאה המוקדמת משנה את המקרה הגרוע של מיון בועות?
לא. מעקב אחרי השאלה אם מעבר ביצע החלפות כלשהן מאפשר למיון בועות לעצור מוקדם ולהגיע ל-O(n) על קלט ממוין, אבל מערך ממוין בסדר הפוך עדיין דורש את כל ההשוואות, ולכן המקרה הגרוע נשאר O(n²). האופטימיזציה עוזרת רק במקרה הטוב ובמקרים הכמעט ממוינים.
איור של שפות התכנות ב-Coddy

לשלוט באלגוריתמים עם Coddy

להתחיל