C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date:...

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

Transcript of C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date:...

Page 1: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

Cמבוא למחשב בשפת

למיון מבוא :11 הרצאה

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

י דן רביב"עודכן ע

מכון טכנולוגי לישראל –כל הזכויות שמורות לטכניון © . י איתן אביאור"נערך ע, ידי טל כהן-נכתב על

Page 2: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

2 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

מיון

ארגון מחדש של סדרה או רשימה של ערכים כך : בעיית מיון• .שהאיברים יהיו מסודרים על פי יחס סדר מוגדר מראש

:דוגמאות ליחסי סדר•

.המוכר בין מספרים ≥היחס –

.סדר לקסיקוגרפי בין מילים במילון–

:הפעולות העיקריות בביצוע מיון הן•

,פ יחס הסדר שנקבע"עריכת השוואה בין שני ערכים ע: השוואה–

.החלפת מיקומם של שני ערכים ברשימה: החלפה–

.נכיר מספר אלגוריתמי מיון ידועים•

:בשיעור זה נדון בבעיה הבאה•

:ערכים nמערך של : נתון–

מיון הערכים במערך: דרישה– :כלומר, בסדר לא יורד

a[0], a[1], ..., a[n-1]

a[0] ≤ a[1] ≤ ... ≤ a[n-1]

Page 3: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

3 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

(Max Sort)מיון המירבי

: מחזורים n−1-נציג אלגוריתם מיון המתבצע ב•

ונעביר אותו , בכל מחזור נמצא את האיבר המירבי במערך הולך וקטן•

:למקומו הנכון

ונחליף בינו לבין האיבר , נאתר את האיבר הגדול ביותר במערך :1מחזור –a[n-1].

a[0]...a[n-2]נאתר את האיבר הגדול ביותר מבין :2מחזור –

.a[n-2]ונחליף בינו לבין

.שני האיברים הגדולים ביותר במערך כבר יושבים במקומותיהם הסופיים–

a[0]...a[n-k]נאתר את האיבר הגדול ביותר מבין :kמחזור –

.a[n-k]ונחליף בינו לבין

–k האיברים הגדולים ביותר במערך כבר יושבים במקומותיהם הסופיים.

.אשר בסופו המערך ממוין n−1 -נמשיך באותה צורה עד המחזור ה–

Page 4: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

4 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

Max Sort – דוגמה

2 9 7 3 5

0 1 2 3 4

1מחזור

2מחזור

3מחזור

4מחזור

2 3 7 9 5

2 3 5 9 7

5 3 2 9 7

5 3 2 9 7

Page 5: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

5 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

מימוש –( Max Sort)מיון המירבי

/* Helper function: finds the index of maximal element */

int index_of_max(int a[], int m)

{

int i, i_max = 0;

for ( i = 1; i < m; i++ )

if ( a[i_max] <= a[i] )

i_max = i;

return i_max;

}

void max_sort(int a[], int n)

{

int length;

for ( length = n; length > 1; length-- ) {

int i_max = index_of_max(a, length);

swap(&a[i_max], &a[length-1]); }

}

Page 6: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

6 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

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

?מה עושה הלולאה הבאה•

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

:ידי הרצת הלולאה דלעיל בתוך כל מחזור-הבעבוע מתבצע על•

a[0]...a[n-k]נבעבע את האיבר הגדול ביותר מבין :kמחזור – .a[n-k]-למקום ה

for ( i = 1; i < m; i++ )

if ( a[i] < a[i-1] )

swap(a + (i–1), a + i);

Page 7: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

7 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

דוגמה –( (Bubble sortמיון בועות

2 9 7 3 5

0 1 2 3 4

1מחזור

2מחזור

3מחזור

4מחזור

5 2 7 9 3

3 5 2 9 7

5 3 2 9 7

5 3 2 9 7

2 9 7 3 5

Page 8: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

8 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

מימוש –( (Bubble sortמיון בועות

/* Helper function: bubble the maximal element up */

void bubble(int a[], int m)

{

int i;

for ( i = 1; i < m; i++ )

if ( a[i] < a[i-1] )

swap(&a[i], &a[i-1]);

}

void bubble_sort(int a[], int n)

{

int length;

for ( length = n; length > 1; length-- )

bubble(a, length);

}

Page 9: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

9 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

מימוש משופר –( (Bubble sortמיון בועות

int bubble(int a[], int m)

{

int i, swapped = 0;

for ( i = 1; i < m; i++ )

if ( a[i] < a[i-1] ) {

swap(&a[i], &a[i-1]);

swapped = 1;

}

return swapped;

}

void bubble_sort(int a[], int n)

{

int length;

for ( length = n; length > 1; length-- )

if ( ! bubble(a, length) )

break;

}

לפעמים המערך כבר ממוין •

,מראש

עוד לפני , או שעל כל פנים•

המחזורים הוא n−1סיום כל

.כבר ממוין

במקרים אלה כדאי לגלות •

עובדה זאת ולהפסיק את

:המעברים המיותרים

Page 10: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

10 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

שיפור מיון המירבי

ניתן לשפר את מיון הבועות כך שלא יבצע מחזורים , כפי שראינו•

.מיותרים לאחר שהמערך כבר ממוין

.באופן דומה ניתן לשפר גם את מיון המירבי•

ואחזנו באיבר , נספור כמה פעמים זנחנו את האיבר הקודם: הרעיון•

.הבא בתור האיבר המירבי

סימן שהמערך אותו , פעמים" מספיק"אם ההחלפה קרתה : הבדיקה•

...סרקנו ממוין

כמה פעמים צריך להחליף את האחיזה במחזור שבו אורך : שאלה•

?כדי לוודא שהוא כולו ממוין mהמערך הנסרק הוא

איך הפונקציה הסורקת יכולה לסמן לפונקצית המיון שהמערך : שאלה•

?ואפשר לסיים, כבר ממוין

Page 11: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

11 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

מימוש משופר –( Max Sort)מיון המירבי /* Helper function: finds the index of maximal element */

int index_of_max(int a[], int m)

{

int i, i_max = 0, changed = 0;

for ( i = 1; i < m; i++ )

if ( a[i_max] <= a[i] ) {

i_max = i;

changed ++ ;

}

return changed < m-1 ? i_max : -1;

}

void max_sort(int a[], int n)

{

int length, i_max;

for ( length = n; length > 1; length-- ) {

if ( (i_max = index_of_max(a, length)) < 0 )

return;

swap(&a[i_max], &a[length-1]);

}

}

int i, i_max = 0, held = 0;

for ( i = 1; i < m; i++ )

if ( a[i_max] <= a[i] )

i_max = i;

else

held = 1;

return held ? i_max : -1;

if ( i_max < length-1 )

swap(&a[i_max], &a[length-1]);

Page 12: C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date: 12/27/2010 2:28:45 PM ...

12 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11

סיבוכיות זמן... ? מהי עלות המיונים

( max sort)של מיון המירבי ( במקרה הגרוע)סיבוכיות הזמן • .O(n2)היא

(.bubble sort)הוא הדין לגבי מיון בועות •

?האם תוכלו להסביר מדוע•

?אילו פעולות אנו סופרים•

?מהו המקרה הגרוע של כל אחד משני המיונים•

?"הפוך"מהי סיבוכיות הזמן במקרה שהמערך ממוין •

אפשר להוכיח תיאורטית שבמקרה הכללי לא ניתן למיין • .O(n·log n)בסיבוכיות זמן קטנה מאשר

...? כיצד, ואם כן? אבל האם בזמן שכזה כן ניתן למיין•