המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

אלגוריתמי מיון רקורסיביים

מצגות קשורות


מצגת בנושא: "אלגוריתמי מיון רקורסיביים"— תמליל מצגת:

1 אלגוריתמי מיון רקורסיביים
מבוא למדעי המחשב ושפת C אלגוריתמי מיון רקורסיביים נכתב ע"י יעל ארז. © כל הזכויות שמורות.

2 תוכן אלגוריתמי מיון רקורסיביים Quick-sort Merge-sort
נכתב ע"י יעל ארז. © כל הזכויות שמורות.

3 רקורסיה – אלגוריתמי מיון
Merge-sort Quick-sort נכתב ע"י יעל ארז. © כל הזכויות שמורות.

4 Merge-sort תזכורת 37 48 56 16 25 61 45 22 37 48 56 16 25 61 45 22 37 48 56 16 25 61 45 22 37 48 56 16 25 61 45 22 נכתב ע"י יעל ארז. © כל הזכויות שמורות.

5 Merge-sort תזכורת 16 22 25 37 45 48 56 61 16 37 48 56 22 25 45 61 37 48 16 56 25 61 22 45 37 48 56 16 25 61 45 22

6 Merge-sort מימוש רקורסיבי
מיון מערך a[] באורך n: 1. תנאי עצירה: מערך באורך 1 ממוין. 2. צעד הרקורסיה: merge-sort לתת מערך שמאלי באורך n/2. merge-sort לתת מערך ימני באורך n-n/ מיזוג 2 תתי המערכים.

7 Merge-sort מימוש רקורסיבי
void merge_sort(int a[], int n) { int* temp = malloc(sizeof(int)*n); merge_sort_aux(a, n, temp); free(temp); } מערך עזר למיזוג void merge_sort_aux(int a[], int n, int temp[]) { if (n <= 1) return; merge_sort_aux (a, n/2, temp); merge_sort_aux (a+n/2, n-n/2, temp); merge(a, n/2, a+n/2, n-n/2, temp); memcpy(a, temp, n*sizeof(int)); } נותר לממש את merge...

8 Merge-sort - מימוש המיזוג
void merge(int a[], int na, int b[], int nb, int temp[]) { int ia=0, ib=0, ic=0; for (; ia<na && ib<nb; ic++) { if (a[ia] < b[ib]) temp[ic] = a[ia++]; else temp[ic] = b[ib++]; } for (;ia<na; temp[ic++] = a[ia++]); for (;ib<nb; temp[ic++] = b[ib++]);

9 Quick-sort נתון מערך a[] של מספרים שלמים בגודל n.
נסמן p=a[0] איבר הציר – pivot. שלב החלוקה – partition. נארגן את איברי המערך (מלבד ה-pivot) בשני חלקים: נחליף בין ה-pivot לאיבר במקום ה-t: 3 2 5 4 1 6 7 t t n-1 3 2 1 5 4 6 7 קטנים מה- pivot גדולים/שווים ל-pivot 5 2 3 4 7 6 1 קטנים מה- pivot t גדולים/שווים ל-pivot נכתב ע"י יעל ארז. © כל הזכויות שמורות.

10 Quick-sort המצב כעת: כל האיברים משמאל ל pivot קטנים ממנו.
נותר לסדר את תת המערך השמאלי ותת המערך הימני. 5 2 3 4 7 6 1 קטנים מה- pivot t גדולים/שווים ל-pivot נכתב ע"י יעל ארז. © כל הזכויות שמורות.

11 Quick-sort – מימוש רקורסיבי
void quick_sort(int a[], int n) { if (n<=1) return; int t = partition(a, n); // rearrange array quick_sort(a, t); quick_sort(a+t+1, n-t-1); } נותר לממש את partition... נכתב ע"י יעל ארז. © כל הזכויות שמורות.

12 Quick-sort – מימוש partition
3 2 5 4 1 6 7 p b t נכתב ע"י יעל ארז. © כל הזכויות שמורות.

13 Quick-sort – מימוש partition
3 2 1 4 5 6 7 p b t נכתב ע"י יעל ארז. © כל הזכויות שמורות.

14 Quick-sort – מימוש partition
3 2 1 4 5 6 7 p b t נכתב ע"י יעל ארז. © כל הזכויות שמורות.

15 Quick-sort – מימוש partition
int partition(int a[], int n) { int pivot = a[0]; int b=1, t=n-1; while (b <= t) { while (b <= t && a[b] < pivot) b++; while (t >= b && a[t] >= pivot) t--; if (b < t) { swap(&a[b++], &a[t--]); } swap(&a[0], &a[t]); return t; נכתב ע"י יעל ארז. © כל הזכויות שמורות.

16 Quick-sort - סיבוכיות ערכי ה-pivot קובעים את זמן הריצה ואת עומק הרקורסיה. המקרה הטוב ביותר: איבר הציר תמיד באמצע המקרה הגרוע ביותר: איבר הציר תמיד הקטן ביותר עומק הרקורסיה: log2 n סיבוכיות ה partition: עומק הרקורסיה: n סיבוכיות ה partition: נכתב ע"י יעל ארז. © כל הזכויות שמורות.

17 Quick-sort למימוש יעיל ה pivot נבחר באקראי.
סיבוכיות זמן למרות זאת נחשב מיון יעיל כי בממוצע איברי הציר "טובים" והסיבוכיות היא סיבוכיות מקום במקרה של איברי ציר "טובים" נובע מעומק הרקורסיה (אין צורך במערך עזר). קיימת פונקצית ספריה qsort המממשת מיון זה. נכתב ע"י יעל ארז. © כל הזכויות שמורות.

18 Bucket-sort #define MIN_VAL 0 #define MAX_VAL 100
void bucket_sort(int arr[], int n) { int hist[MAX_VAL - MIN_VAL + 1] = { 0 }; for (int i = 0; i < n; i++) hist[arr[i] - MIN_VAL]++; int idx = 0; for (int val = MIN_VAL; val <= MAX_VAL; val++) for (int i = 0; i < hist[val - MIN_VAL]; i++) arr[idx++] = val; } נכתב ע"י יעל ארז. © כל הזכויות שמורות.


הורד את "ppt "אלגוריתמי מיון רקורסיביים

מצגות קשורות


מודעות Google