מיון מסרק הוא אלגוריתם מיון פשוט יחסית שתוכנן במקור על ידי Włodzimierz Dobosiewicz ב-1980.[1] לאחר מכן הוא התגלה מחדש על ידי סטיבן לייסי וריצ'רד בוקס בשנת 1991.[2] מיון מסרק הוא שיפור של מיון בועות.

מיון מסרק
המחשה של מיון מסרק
המחשה של מיון מסרק
מחלקה אלגוריתם מיון
סיבוכיות זמן
  • במקרה הטוב: ,
  • במקרה הממוצע: , כאשר הוא מספר ההגדלות
  • במקרה הגרוע:
סיבוכיות מקום

האלגוריתם

עריכה

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

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

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

לגורם הכיווץ יש השפעה גדולה על יעילות האלגוריתם.   הוצע כגורם הכיווץ האידיאלי על ידי מחברי המאמר המקורי, לאחר בדיקה אמפירית של למעלה מ-200,000 רשימות אקראיות. ערך קטן מדי מאט את האלגוריתם וגורם לו לבצע השוואות רבות שלא לצורך, בעוד שערך גדול מדי לא מצליח להתמודד ביעילות עם צבים.

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

פסאודו קוד

עריכה
 function combsort(array input)

    gap := input.size // Initialize gap size
    shrink := 1.3 // Set the gap shrink factor
    sorted := false

    loop while sorted = false
        // Update the gap value for a next comb
        gap := floor(gap / shrink)
        if gap > 1
            sorted := false // We are never sorted as long as gap > 1
        else
            gap := 1
            sorted := true // If there are no swaps this pass, we are done
        end if

        // A single "comb" over the input list
        i := 0
        loop while i + gap < input.size // See Shell sort for a similar idea
            if input[i] > input[i+gap]
                swap (input[i], input[i+gap])
                sorted := false
                // If this assignment never happens within the loop,
                // then there have been no swaps and the list is sorted.
             end if

             i := i + 1
         end loop
         
end loop end function

לקריאה נוספת

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

קישורים חיצוניים

עריכה
  מדיה וקבצים בנושא מיון מסרק בוויקישיתוף

הערות שוליים

עריכה
  1. ^ Wlodzimierz Dobosiewicz (1980). "An efficient variation of bubble sort". Information Processing Letters. 11: 5–6. doi:10.1016/0020-0190(80)90022-8.
  2. ^ "A Fast Easy Sort", Byte Magazine, April 1991