מיון בסיס

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

מיון בסיס (Radix sort) הוא אלגוריתם מיון של מספרים המסתמך על כך שמספר הספרות בייצוג המספרים חסום על ידי קבוע. (למשל: מספר הספרות בייצוג המספר 1234567 הוא 7).

ניתן לממש מיון בסיס כמיון יציב, כלומר מיון ששומר על הסדר הפנימי בין שני ערכים זהים.

מיון הבסיס מתבצע בדרך כלל בזמן ריצה של \ O(n*k), כאשר n הוא גודל הקלט ו-k הוא מספר הספרות המקסימלי בכל מספר.

מהלך האלגוריתם[עריכת קוד מקור | עריכה]

הדוגמה הבאה מתייחסת למספרים המיוצגים בבסיס 10, כך שכל ספרה קטנה מ-10. ניתן להכליל זאת בקלות לבסיס k כלשהו:

  1. מיון כל המספרים בקבוצה ל־10 קבוצות, על פי ספרת האחדות שלהם.
  2. מיון יציב (מספרים בעלי אותו ערך יישארו באותו סדר גם לאחר המיון) של כל המספרים מהקבוצות שהתקבלו שוב, ל־10 קבוצות, על פי ספרת העשרות של כל מספר, תוך כדי שמירה על סדר המספרים בתוך כל קבוצה, לפי המיון של השלב הקודם.
  3. המשך מיון המספרים על פי הספרה החשובה יותר (מאות, ואז אלפים, ואז עשרות אלפים וכן הלאה), תוך שמירת סדר המספרים בכל קבוצה לפי המיון של השלב הקודם לשלב הנוכחי.

דוגמת הרצה[עריכת קוד מקור | עריכה]

נביט ברשימה הלא ממויינת הבאה:

170, 45, 75, 90, 802, 2, 24, 66

נמיין את הרשימה לפי הסיבית הכי פחות משמעותית, האחדות:

170, 90, 802, 2, 24, 45, 75, 66
כדאי לשים לב ש-802 בא לפני 2, מכיוון ש-802 הופיע לפני 2 ברשימה המקורית. אותו דבר קורה גם עבור הזוגות 170, 90 ו-45, 75.

נמיין את הרשימה לפי הסיבית הבאה, העשרות:

802, 2, 24, 45, 66, 170, 75, 90
שימו לב ששוב 802 בא לפני 2 מכיוון ש-802 בא לפני 2 ברשימה הקודמת.

לבסוף, נמיין את הרשימה לפי הסיבית המשמעותית ביותר:

2, 24, 45, 66, 75, 90, 170, 802

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

זמן ריצה[עריכת קוד מקור | עריכה]

עקרונית, זמן הריצה של האלגוריתם הוא \ O(k*(n+d)), כאשר n הוא כמות המספרים בקלט, k הוא מספר הספרות המקסימלית בכל מספר ו-d הוא הבסיס בו המספרים נתונים. עם זאת, לרוב המספרים נתונים בבסיס ידוע, כך שלכל בסיס שהוא מתקיים \ d=O(1) ולכן זמן הריצה יהיה \ O(n*k).

אם גודל הקלט, כלומר מספר המספרים שיש למיין, הוא בסדר גודל גדול מזה של מספר הספרות (או: k זניח ביחס לn), כלומר \ k=o(n), זמן הריצה יהיה \ O(k*n)=O(2n)=O(n), כאשר זמן הריצה המינימלי למיון \ n מספרים ללא הנחות ידועות על היחס בין גודל הקלט למספר הספרות המקסילי כלשהן הוא \ O(nlog(n)).

חשוב לשים לב שלא בכל המקרים \ O(n*k)<O(n*log(n)), והדבר תלוי ביחס שבין גודל הקלט למספר הספרות בכל מספר (לדוגמה, שני מספרים בעלי 10 ספרות עשרוניות ימוינו מהר יותר במיון מיזוג מאשר במיון בסיס).

ראו גם[עריכת קוד מקור | עריכה]

קישורים חיצוניים[עריכת קוד מקור | עריכה]