Menu
Coddy logo textTech

Radix Sort (מיון בסיס)

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

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

Radix sort רץ בזמן O(d·(n + k)), כאשר d הוא מספר הספרות ו-k הוא הבסיס (כאן 10). עבור מספרים שלמים ברוחב קבוע זה בפועל זמן ליניארי, והוא יכול לנצח מיונים מבוססי השוואה של O(n log n), אבל הוא עובד רק על נתונים שאפשר לפרק לספרות או למפתחות.

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

מקרהסיבוכיותהערות
זמןO(d·(n + k))d ספרות, בסיס k (ליניארי עבור d קבוע)
זיכרוןO(n + k)מערך פלט וספירות ספרות
יציבכןכל מעבר ספרה הוא מיון מנייה יציב
מבוסס השוואה?לאממיין לפי ספרה, לא בהשוואת ערכים
עובד עלמספרים שלמים ומפתחותלא על אובייקטים כלליים שניתנים להשוואה

צעד אחר צעד

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

דוגמה מפורטת

מיון של [170, 45, 75, 90, 2, 24, 66]:

מעברמערךפעולה
התחלה[170, 45, 75, 90, 2, 24, 66]המקסימום הוא 170, ולכן צריך שלושה מעברי ספרות.
אחדות[170, 90, 2, 24, 45, 75, 66]מיון יציב לפי ספרת האחדות: 0, 0, 2, 4, 5, 5, 6.
עשרות[2, 24, 45, 66, 170, 75, 90]מיון יציב לפי ספרת העשרות: 0, 2, 4, 6, 7, 7, 9 (170 שומר על מקומו לפני 75).
מאות[2, 24, 45, 66, 75, 90, 170]מיון יציב לפי ספרת המאות; רק ל-170 יש 1, ולכן הוא זז לסוף. ממוין.

מתי להשתמש ב-radix sort

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

קוד Radix Sort

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

קוד Radix Sort ב-Python

Python
1def radix_sort(a):2    # Sort by each decimal digit, least significant first3    max_value = max(a)4    exp = 15    while max_value // exp > 0:6        a = sort_by_digit(a, exp)7        exp *= 108    return a9
10
11def sort_by_digit(a, exp):12    buckets = [[] for _ in range(10)]13    for value in a:14        digit = (value // exp) % 1015        buckets[digit].append(value)16    # Concatenating buckets 0..9 keeps the sort stable17    return [value for bucket in buckets for value in bucket]18
19
20nums = [170, 45, 75, 90, 802, 24, 2, 66]21print("Before:", nums)22print("After: ", radix_sort(nums))
להריץ את הקוד הזה בעורך ה-Python אונליין

שאלות נפוצות על radix sort

מהי סיבוכיות הזמן של radix sort?
Radix sort הוא O(d·(n + k)), כאשר d הוא מספר הספרות ו-k הוא הבסיס. עבור מספרים שלמים ברוחב קבוע זה בפועל O(n), וזה יכול להיות מהיר יותר ממיונים מבוססי השוואה. הוא משתמש ב-O(n + k) זיכרון נוסף.
האם radix sort יציב?
כן. LSD radix sort נשען על מיון מנייה יציב בכל ספרה; היציבות היא מה שגורם לגישה של ספרה אחר ספרה לייצר תוצאה ממוינת נכון.
מתי אפשר להשתמש ב-radix sort?
Radix sort עובד על נתונים שאפשר לפרק לספרות או למפתחות בגודל קבוע, כמו מספרים שלמים או מחרוזות באורך קבוע. הוא לא מיון כללי מבוסס השוואה, ולכן הוא לא יכול למיין אובייקטים כלשהם לפי פונקציית השוואה מותאמת.
במה radix sort שונה ממיון מנייה?
מיון מנייה ממיין לפי מפתח יחיד במעבר אחד וצריך מערך ספירה בגודל טווח הערכים, ולכן הוא מידרדר כשהערכים מפוזרים. Radix sort מפעיל מיון מנייה ספרה אחר ספרה ושומר על מערך ספירה קטן בכל מעבר (בסיס k), וכך הוא מתמודד עם טווחי ערכים גדולים שמיון מנייה רגיל לא היה מסוגל להם.
למה LSD radix sort מתחיל בספרה הפחות משמעותית?
התחלה מהספרה הפחות משמעותית מאפשרת לכל מעבר יציב לשמור על הסדר שנקבע על ידי כל הספרות הקודמות, הפחות משמעותיות. עד שמטפלים בספרה המשמעותית ביותר, מקרי שוויון בספרה הזו כבר מסודרים נכון לפי הספרות הנמוכות, ולכן המערך מסתיים ממוין לגמרי. מיון מהספרה המשמעותית ביותר קודם היה שובר את זה ודורש גישה רקורסיבית אחרת (MSD radix sort).
האם radix sort יכול להתמודד עם מספרים שליליים?
לא באופן ישיר: חילוץ הספרות הבסיסי מניח מספרים שלמים אי שליליים. פתרונות נפוצים הם להזיז את כל הערכים על ידי הוספת המינימום כך שהכל יהיה אי שלילי, או למיין בנפרד את השליליים ואת האי שליליים ואז לשרשר אותם. התעלמות מזה היא באג נפוץ כשמפעילים radix sort על נתונים אמיתיים.
איור של שפות התכנות ב-Coddy

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

להתחיל