שיטות למיון מערכים ברובי

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

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

"מפעיל החללית" לוקח שני אובייקטים, משווה ביניהם ואז מחזיר -1, 0 או 1. זה קצת מעורפל, אבל למפעיל עצמו אין התנהגות מוגדרת היטב. בוא ניקח למשל אובייקטים מספריים. אם יש לך שני אובייקטים מספריים א ו בולהעריך א <=> ב, מה יעריך הביטוי? במקרה של מספרים, קל לדעת. אם a גדול מ- b, הוא יהיה -1, אם הם שווים הוא יהיה 0 ואם b גדול מ- a, הוא יהיה 1. זה משמש כדי לספר לאלגוריתם המיון לאיזה משני האובייקטים צריך לעבור קודם

instagram viewer
מערך. רק זכרו שאם האופרה השמאלית אמורה להגיע ראשונה במערך, היא צריכה להעריך עד -1, אם היד הימנית צריכה להיות ראשונה היא צריכה להיות 1, ואם זה לא משנה היא צריכה להיות 0.

זה לא תמיד פועל לפי כללים מסודרים כאלה. מה קורה אם אתה משתמש במפעיל זה בשני אובייקטים מסוגים שונים? כנראה שתקבל חריג. מה קורה כשאתה מתקשר 1 <=> 'קוף'? זה יהיה המקבילה לשיחות 1. <=> ('קוף')כלומר, נקראת השיטה בפועל על ה- שמאלה אופרנד ו Fixnum # <=> מחזירה אפסי אם האופרנד הימני אינו מספרי. אם המפעיל מחזיר אפסי, שיטת המיון תעלה חריג. לכן, לפני שממיינים מערכים וודאו שהם מכילים אובייקטים שניתן למיין.

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

יש לך מערך של אובייקטים מספריים ואתה רוצה למיין אותם. ישנן שתי שיטות עיקריות לעשות זאת: סוג ו סוג!. הראשון יוצר עותק של המערך, ממיין אותו ומחזיר אותו. השני ממיין את המערך במקום.

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

איך זה עובד? ראשית, שימו לב לטיעון החסימה לשיטת המיון. שנית, שימו לב לחטיבות המודולו שנעשו בפרמטרי החסימה, ושימוש חוזר של מפעיל החללית. אם אחד הוא מכפיל של 3, המודולו יהיה 0, אחרת הוא יהיה 1 או 2. מכיוון ש- 0 ימיין לפני 1 או 2, רק המודולו חשוב כאן. השימוש בפרמטר חסום שימושי במיוחד במערכים שיש בהם יותר מסוג אלמנט אחד, או כאשר ברצונך למיין לפי מחלקות מותאמות אישית שאין להם מפעיל חללית מוגדר.

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