C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date:...
Transcript of C תפשב בשחמל אובמ - webcourse.cs.technion.ac.il 1 Author: saher Created Date:...
Cמבוא למחשב בשפת
למיון מבוא :11 הרצאה
איתן אביאור , גיתית רוקשטיין, י שי ארצי"מבוסס על השקפים שחוברו ע ".מבוא למדעי המחשב"וסאהר אסמיר עבור הקורס
י דן רביב"עודכן ע
מכון טכנולוגי לישראל –כל הזכויות שמורות לטכניון © . י איתן אביאור"נערך ע, ידי טל כהן-נכתב על
2 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11
מיון
ארגון מחדש של סדרה או רשימה של ערכים כך : בעיית מיון• .שהאיברים יהיו מסודרים על פי יחס סדר מוגדר מראש
:דוגמאות ליחסי סדר•
.המוכר בין מספרים ≥היחס –
.סדר לקסיקוגרפי בין מילים במילון–
:הפעולות העיקריות בביצוע מיון הן•
,פ יחס הסדר שנקבע"עריכת השוואה בין שני ערכים ע: השוואה–
.החלפת מיקומם של שני ערכים ברשימה: החלפה–
.נכיר מספר אלגוריתמי מיון ידועים•
:בשיעור זה נדון בבעיה הבאה•
:ערכים nמערך של : נתון–
מיון הערכים במערך: דרישה– :כלומר, בסדר לא יורד
a[0], a[1], ..., a[n-1]
a[0] ≤ a[1] ≤ ... ≤ a[n-1]
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 -נמשיך באותה צורה עד המחזור ה–
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
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]); }
}
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);
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
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);
}
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סיום כל
.כבר ממוין
במקרים אלה כדאי לגלות •
עובדה זאת ולהפסיק את
:המעברים המיותרים
10 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11
שיפור מיון המירבי
ניתן לשפר את מיון הבועות כך שלא יבצע מחזורים , כפי שראינו•
.מיותרים לאחר שהמערך כבר ממוין
.באופן דומה ניתן לשפר גם את מיון המירבי•
ואחזנו באיבר , נספור כמה פעמים זנחנו את האיבר הקודם: הרעיון•
.הבא בתור האיבר המירבי
סימן שהמערך אותו , פעמים" מספיק"אם ההחלפה קרתה : הבדיקה•
...סרקנו ממוין
כמה פעמים צריך להחליף את האחיזה במחזור שבו אורך : שאלה•
?כדי לוודא שהוא כולו ממוין mהמערך הנסרק הוא
איך הפונקציה הסורקת יכולה לסמן לפונקצית המיון שהמערך : שאלה•
?ואפשר לסיים, כבר ממוין
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]);
12 © כל הזכויות שמורות C. מבוא למחשב בשפת הרצאה 11
סיבוכיות זמן... ? מהי עלות המיונים
( max sort)של מיון המירבי ( במקרה הגרוע)סיבוכיות הזמן • .O(n2)היא
(.bubble sort)הוא הדין לגבי מיון בועות •
?האם תוכלו להסביר מדוע•
?אילו פעולות אנו סופרים•
?מהו המקרה הגרוע של כל אחד משני המיונים•
?"הפוך"מהי סיבוכיות הזמן במקרה שהמערך ממוין •
אפשר להוכיח תיאורטית שבמקרה הכללי לא ניתן למיין • .O(n·log n)בסיבוכיות זמן קטנה מאשר
...? כיצד, ואם כן? אבל האם בזמן שכזה כן ניתן למיין•