מיונים וחיפושים קרן כליף.

Slides:



Advertisements
Similar presentations
מבוא למדעי המחשב לתעשייה וניהול
Advertisements

מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
מערכים ומטריצות קרן כליף.
שאלות ממבחנים. 14 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©2 תרגיל 1: מטריצות כתבו פונקציהvoid Rotation(int in [N][N], int out [N][N]) אשר מקבלת שני.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
רקורסיות נושאי השיעור מהן רקורסיות פתרון רקורסיות : שיטת ההצבה שיטת איטרציות שיטת המסטר 14 יוני יוני יוני 1514 יוני יוני יוני 1514.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
11 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא לשפת C תרגול 12: עוד רקורסיה
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
ערמות ; מבני נתונים 09 מבוסס על מצגות של ליאור שפירא, חיים קפלן, דני פלדמן וחברים.
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות – שיעור 7. חזרה -מערכים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים זהים נגדיר בעזרתו קבוצת משתנים כאשר יהיה לנו מספר רב של משתנים.
תכנות תרגול 14 שבוע:
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
ערכים עצמיים בשיטות נומריות. משוואה אופינית X מציין וקטור עצמי מציינת ערך עצמי תואם לוקטור.
מבוא כללי למדעי המחשב רשימות מקושרות
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
יחס סדר חלקי.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
1 מבוא למדעי המחשב backtracking. 2 מוטיבציה בעיית n המלכות: נתון: לוח שחמט בגודל. המטרה: לסדר על הלוח n מלכות כך שאף אחת לא תאיים על השנייה. דוגמא: עבור.
תכנות תרגול 8 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
מבוא למדעי המחשב הרצאה 11: תכנות רקורסיבי 4 כולל מיון רקורסיבי 1.
Void*, pointer to functions, variadic functions קרן כליף.
קורס תכנות שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב.
Data Structures Hanoch Levi and Uri Zwick March 2011 Lecture 3 Dynamic Sets / Dictionaries Binary Search Trees.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
סיביות קרן כליף. © Keren Kalif 2 ביחידה זו נלמד:  מוטיבציה  אופרטורים לעבודה עם סיביות:  &  |  ^  ~  >> 
1 Programming for Engineers in Python Autumn Lecture 9: Sorting, Searching and Time Complexity Analysis.
1 מבוא למדעי המחשב הרצאה 5: פונקציות. 2 מבוא לפונקציות חלוקה של אלגוריתם לתת משימות: משימה - פונקציה: דוגמאות מציאת המקסימלי מבין שני איברים האינדקס של.
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבוא למדעי המחשב לתעשייה וניהול
הרצאה 10 פונקציות עם מספר משתנה של פרמטרים
מבוא למדעי המחשב סיבוכיות.
הקצאות דינאמיות בשילוב מבנים
רקורסיות קרן כליף.
ניתוח זמן ריצה (על קצה המזלג)
רקורסיות קרן כליף.
מצביעים קרן כליף.
מערכים קרן כליף.
תירגול 14: מבני נתונים דינאמיים
הרצאה 06 רשימות מקושרות קרן כליף.
תרגול מס' 7: Memoization Quicksort תרגילים מתקדמים ברקורסיה
הרצאה 07 עצים קרן כליף.
הקצאות דינאמיות קרן כליף.
מבנים קרן כליף.
תכנות מכוון עצמים בשפת JAVA
ניתוח זמן ריצה (על קצה המזלג)
מבוא למדעי המחשב הרצאה 6: מיונים.
מיונים וחיפושים קרן כליף.
מצביעים קרן כליף.
מיונים וחיפושים קרן כליף.
ניתוח זמן ריצה (על קצה המזלג)
מערכים ומטריצות קרן כליף.
תרגול 8 תחומי הכרה פונקציות
תכנות מכוון עצמים ושפת JAVA
מבוא כללי למדעי המחשב תרגול 6
מיונים וחיפושים קרן כליף.
מחרוזות קרן כליף.
שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב
Presentation transcript:

מיונים וחיפושים קרן כליף

ביחידה זו נלמד: מהו מיון מוטיבציה למיון מיון בועות (Bubble Sort) מיון בסדר עולה, מיון בסדר יורד, מיון טקסט Selection Sort Insertion Sort חיפוש בינארי מימוש איטרטיבי מימוש רקורסיבי מיזוג מערכים ממוינים 2 © Keren Kalif

מהו מיון מיון הוא סידור איברי קבוצה מסוימת בסדר עולה או בסדר יורד הקבוצה היחידה שאנו מכירים עד כה היא מערך, לכן נראה כיצד ממיינים מערך 3 1 9 2 מערך לא ממוין: 1 2 3 9 מערך ממוין: 3 © Keren Kalif

מוטיבציה למיון – שיקולי יעילות בחיפוש ערך מסוים כדי למצוא את האיבר המינימאלי במערך, צריך לסרוק את כל האיברים (חיפוש לינארי) יעילות: O(n) אם המערך ממוין צריך לבדוק מהו ערכו של האיבר הראשון בלבד יעילות: O(1) כדי למצוא את האיבר המקסימאלי במערך, צריך לסרוק את כל האיברים (חיפוש לינארי) אם המערך ממוין צריך לבדוק מהו ערכו של האיבר האחרון בלבד 4 © Keren Kalif

מוטיבציה למיון – שיקולי יעילות בחיפוש ערך מסוים (2) כדי למצוא איבר כלשהו, צריך לסרוק את כל האיברים יעילות: O(n) אם המערך ממוין ניתן למצוא את האיבר ב- O(log(n)) שזה שיפור בסדר גודל שלם! כדי למצוא איבר במערך ממוין בסדר גודל של O(log(n)) נשתמש בחיפוש בינארי 5 © Keren Kalif

מיון בועות הרעיון מאחורי השם הוא שמפעפעים את האיבר המתאים למעלה ע"י החלפות הרעיון מאחורי מיון בועות (עבור מיון מהערך הקטן לגדול): באיטרציה הראשונה נפעפע את האיבר המקסימלי לסוף המערך ונמקם אותו במקום ה- n-1 ע"י החלפות באיטרציה השניה נפעפע את האיבר המקסימלי מבין האיברים 0 עד n-2 ונמקם אותו במקום ה- n-2 ע"י החלפות וכו' עד סוף המערך המצב בסיום האיטרציה ה- k שיש לנו את k האיברים הגדולים ביותר במערך ממוינים ב- k האיברים האחרונים 6 © Keren Kalif

מיון בועות – דוגמת הרצה 1 3 2 9 1 3 9 2 3 1 9 2 1 2 3 9 אם האיבר השמאלי גדול מהימני, נחליף בינהם החלף 1 < 3 ? 9 < 3 ? החלף 2 < 9 ? המצב כעת הוא שהאיבר המקסימלי אכן נמצא בסוף, ונתייחס רק למערך שמשמאל לקו 3 < 1 ? החלף 2 < 3 ? המצב כעת הוא ששני האיברים המקסימאלים אכן נמצאים ממוינים בסוף, ונתייחס רק למערך שמשמאל לקו 2 < 1 ? 7 © Keren Kalif

ניתוח זמן ריצה: O(size2) מיון בועות - הקוד void main() { int arr[] = {3,8,1,4}; int size = sizeof(arr)/sizeof(arr[0]); int i, j, temp; for ( ; ; ) for ( ; ; ) if (arr[j] > arr[j+1]) temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } for (i=0 ; i < size ; i++) printf("%d ", arr[i]); printf("\n"); int[]: arr 3 1000 1 1004 4 1008 8 1012 int: size 1016 int: i 2 1020 int: j 1024 int: temp 1028 int[]: arr 3 1000 1 1004 4 1008 8 1012 int: size 1016 int: i 2 1020 int: j 1024 int: temp 1028 int[]: arr 3 1000 1 1004 4 1008 8 1012 int: size 1016 int: i 2 1020 int: j 1024 int: temp 1028 int[]: arr 3 1000 1 1004 4 1008 8 1012 int: size 1016 int: i 1020 int: j 2 1024 int: temp 1028 int[]: arr 3 1000 1 1004 8 1008 4 1012 int: size 1016 int: i 1020 int: j 2 1024 int: temp 1028 int[]: arr 1 1000 1004 4 1008 8 1012 int: size 1016 int: i 2 1020 int: j 1024 int: temp 3 1028 int[]: arr 3 1000 1 1004 4 1008 8 1012 int: size 1016 int: i 1020 int: j 1024 int: temp 1028 int[]: arr 1 1000 3 1004 4 1008 8 1012 int: size 1016 int: i 2 1020 int: j 1024 int: temp 1028 int[]: arr 1 1000 3 1004 4 1008 8 1012 int: size 1016 int: i 1020 int: j 1024 int: temp 1028 int[]: arr 1 1000 3 1004 4 1008 8 1012 int: size 1016 int: i 1020 int: j 1024 int: temp 1028 int[]: arr 1 1000 3 1004 4 1008 8 1012 int: size 1016 int: i 1020 int: j 1024 int: temp 1028 int[]: arr 1 1000 3 1004 4 1008 8 1012 int: size 1016 int: I 1020 int: j 2 1024 int: temp 1028 int[]: arr 1 1000 3 1004 4 1008 8 1012 int: size 1016 int: i 2 1020 int: j 1024 int: temp 1028 int[]: arr 1 1000 3 1004 4 1008 8 1012 int: size 1016 int: i 2 1020 int: j 1024 int: temp 1028 int[]: arr 3 1000 1 1004 8 1008 4 1012 int: size 1016 int: i 1020 int: j 2 1024 int: temp 1028 int[]: arr 3 1000 1 1004 4 1008 1012 int: size 1016 int: i 1020 int: j 2 1024 int: temp 8 1028 int[]: arr ??? 1000 1004 1008 1012 int: size 1016 int: i 1020 int: j 1024 int: temp 1028 int[]: arr 3 1000 8 1004 1 1008 4 1012 int: size ??? 1016 int: i 1020 int: j 1024 int: temp 1028 int[]: arr 3 1000 8 1004 1 1008 4 1012 int: size 1016 int: i ??? 1020 int: j 1024 int: temp 1028 int[]: arr 3 1000 8 1004 1 1008 4 1012 int: size 1016 int: i 1020 int: j ??? 1024 int: temp 1028 int[]: arr 3 1000 8 1004 1 1008 4 1012 int: size 1016 int: i 1020 int: j 1024 int: temp ??? 1028 int[]: arr 3 1000 1 1004 1008 4 1012 int: size 1016 int: i 1020 int: j 1024 int: temp 8 1028 int[]: arr 3 1000 1 1004 8 1008 4 1012 int: size 1016 int: i 1020 int: j 1024 int: temp 1028 int[]: arr 3 1000 8 1004 1 1008 4 1012 int: size 1016 int: i 1020 int: j 1024 int: temp 1028 int[]: arr 3 1000 8 1004 1 1008 4 1012 int: size 1016 int: i 1020 int: j 1024 int: temp ??? 1028 i=size-1 i > 0 i-- j=0 j < i j++ 1 2 3 1 3 4 8 3 1 4 8 3 1 8 4 3 8 1 4 ניתוח זמן ריצה: O(size2) 8 © Keren Kalif

מיון בועות – קצת סדר ופונקציות (1) #include <stdio.h> void swap(int* a, int* b); void main() { int arr[] = {3,8,1,4}; int i, j, size = sizeof(arr)/sizeof(arr[0]); for ( i=size-1 ; i > 0 ; i-- ) for ( j=0 ; j < i ; j++ ) if (arr[j] > arr[j+1]) swap(&arr[j], &arr[j+1]); } for (i=0 ; i < size ; i++) printf("%d ", arr[i]); printf("\n"); void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } 9 © Keren Kalif

מיון בועות – קצת סדר ופונקציות (2) #include <stdio.h> void sortAscending(int arr[], int size); void swap(int* a, int* b); void main() { int arr[] = {3,8,1,4}; int i, size = sizeof(arr)/sizeof(arr[0]); sortAscending(arr, size); for (i=0 ; i < size ; i++) printf("%d ", arr[i]); printf("\n"); } void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } void sortAscending(int arr[], int size) int i, j; for ( i=size-1 ; i > 0 ; i-- ) for ( j=0 ; j < i ; j++ ) if (arr[j] > arr[j+1]) swap(&arr[j], &arr[j+1]); 10 © Keren Kalif

מיון בועות – השינוי עבור מערך ממוין בסדר יורד 11 © Keren Kalif מיון בועות – השינוי עבור מערך ממוין בסדר יורד #include <stdio.h> void sortDescending(int arr[], int size); void swap(int* a, int* b); void main() { int arr[] = {3,8,1,4}; int i, size = sizeof(arr)/sizeof(arr[0]); sortDescending(arr, size); for (i=0 ; i < size ; i++) printf("%d ", arr[i]); printf("\n"); } void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } void sortDescending(int arr[], int size) int i, j; for ( i=size-1 ; i > 0 ; i-- ) for ( j=0 ; j < i ; j++ ) if (arr[j] > arr[j+1]) swap(&arr[j], &arr[j+1]); כדי למיין את המערך בסדר יורד, נרצה לפעפע את האיבר הקטן ביותר לסוף. לכן השינוי היחידי הוא בתנאי לפני ההחלפה (וכמובן ששם הפונקציה)

מיון בועות – מיון טקסט (1) #define LINES 5 #define LEN 30 void swap(char* a, char* b); void sortAscending(char text[][LEN], int lines); void main() { char text[LINES][LEN]; int i; printf("Please enter %d lines:\n", LINES); for (i=0 ; i < LINES ; i++) gets(text[i]); sortAscending(text, LINES); printf(“\nThe sorted text:\n"); printf("%s\n", text[i]); } 12 © Keren Kalif

מיון בועות – מיון טקסט (2) void swap(char* a, char* b) { char temp[LEN]; strcpy(temp, a); strcpy(a, b); strcpy(b, temp); } void sortAscending(char text[][LEN], int lines) int i, j; for (i=lines-1 ; i > 0 ; i--) for ( j=0 ; j < i ; j++ ) if (strcmp(text[j], text[j+1]) > 0) swap(text[j], text[j+1]); 13 © Keren Kalif

מיון בועות: אופטימיזציה void sortAscending(int arr[], int size) { int i, j; int hasChanged=1; for ( i=size-1 ; i > 0 ; i-- ) } hasChanged = 0; for ( j=0 ; j < i ; j++ ) if (arr[j] > arr[j+1]) swap(&arr[j], &arr[j+1]); hasChanged = 1; && hasChanged התוספת: לאחר איטרציה ללא כל החלפה, ברור כי המערך כבר ממוין ולכן נפסיק 14 © Keren Kalif

Selection Sort במיון זה מחפשים באיטרציה הראשונה את הערך המינימלי ושמים אותו באינדקס ה- 0, ובמקומו שמים את הערך שהיה באינדקס ה- 0 באיטרציה השניה מחפשים את הערך הנמוך ביותר החל מאינדקס 1, ומחליפים אותו עם הערך באינדקס 1 וכו' 3 5 7 8 8 5 7 3 min min min 15 © Keren Kalif

יעילות: סכום של סדרה חשבונית ולכן O(size2) void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } void selectionSort(int arr[], int size) int i,j, minIndex; for (i=0 ; i < size ; i++) minIndex = i; for (j=i+1 ; j < size ; j++) if (arr[j] < arr[minIndex]) minIndex = j; swap(&arr[i], &arr[minIndex]); void main() int arr[] = {5,2,8,1,3}; selectionSort(arr, sizeof(arr)/sizeof(arr[0])); Selection Sort - הקוד יעילות: סכום של סדרה חשבונית ולכן O(size2) 16 © Keren Kalif

Insertion Sort הרעיון: נכניס כל איבר למקומו http://www.youtube.com/watch?v=ROalU379l3U Insertion Sort הרעיון: נכניס כל איבר למקומו 4 3 5 2 4 3 5 2 3 4 5 2 3 4 5 2 2 3 4 5 3 2 4 5 3 4 2 5 3 4 5 2 17 © Keren Kalif

יעילות: סכום של סדרה חשבונית ולכן O(size2) Insertion Sort - הקוד void insertionSort(int arr[], int size) { int i,j; for (i=1 ; i < size ; i++) for (j=i ; j > 0 && arr[j-1] > arr[j] ; j--) int temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp; } void main() int arr[] = {7,1,8,2,3,6,4,5}; insertionSort(arr, sizeof(arr)/sizeof(arr[0])); יעילות: סכום של סדרה חשבונית ולכן O(size2) 18 © Keren Kalif

חיפוש בינארי מטרתו של חיפוש בינארי היא למצוא את מיקומו של איבר במערך ממוין לא ניתן להפעיל חיפוש בינארי על מערך לא ממוין! הגדרתו: int binarySearch(int arr[], int size, int value) הפונקציה מקבלת: מערך, גודלו וערך לחיפוש הפונקציה מחזירה: את האינדקס של האיבר, או 1- אם לא נמצא 19 © Keren Kalif

חיפוש בינארי - הרעיון כל עוד יש במערך איברים: נחזיר 1- (לא מצאנו..) נבדוק האם האיבר שאנחנו מחפשים הוא האמצעי אם כן, נחזיר את האינדקס שלו אחרת אם הוא קטן מהאיבר האמצעי, נחפש אותו בחצי המערך השמאלי אחרת, נחפש אותו בחצי המערך הימני נחזיר 1- (לא מצאנו..) דוגמא, נחפש את הערך 39 במערך: 1 2 3 4 5 6 7 8 9 10 3 4 7 14 22 34 37 39 40 44 50 3 4 7 14 22 34 37 39 40 44 50 3 4 7 14 22 34 37 39 40 44 50 20 © Keren Kalif

חיפוש בינארי - ניתוח זמן ריצה בכל איטרציה מספר הפעולות קבוע בכל איטרציה גודל הקלט שלנו קטן פי 2, לכן יהיו לנו log(n) איטרציות בסה"כ זמן החישוב במקרה הגרוע ביותר הוא O(log(n)), לעומת O(n) בחיפוש לינארי שמו של חיפוש בינארי בא מכך שאנו מטפלים בכל איטרציה ב- ½ מהקלט (בינארי=2) 21 © Keren Kalif

חיפוש בינארי – הקוד (חיפוש 4) #define NOT_FOUND -1 int binarySearch(int a[], int size, int val) { int low=0,high=size-1, middle; while (low <= high) middle = (low + high)/2; if (val == a[middle]) return middle; else if (val < a[middle]) high = middle -1; else low = middle +1; } return NOT_FOUND; void main() int arr[] = {1, 4, 7, 9, 12, 16}, index, value; int size = sizeof(arr)/sizeof(arr[0]); printf("Please enter the value to search: "); scanf("%d", &value); index = if (index == NOT_FOUND) printf("The value %d doesn't exist in the array\n", value); printf("The value %d exists in index %d\n", value, index); חיפוש בינארי – הקוד (חיפוש 4) int*: a 1000 2000 int: size 6 2004 int: val 4 2008 int: low 2012 int: high 5 2016 int: middle 2 2020 int*: a 1000 2000 int: size 6 2004 int: val 4 2008 int: low 2012 int: high 5 2016 int: middle ?? 2020 int*: a 1000 2000 int: size 6 2004 int: val 4 2008 int: low 2012 int: high 1 2016 int: middle 2 2020 int*: a 1000 2000 int: size 6 2004 int: val 4 2008 int: low 2012 int: high 1 2016 int: middle 2020 int*: a 1000 2000 int: size 6 2004 int: val 4 2008 int: low 1 2012 int: high 2016 int: middle 2020 int*: a 1000 2000 int: size 6 2004 int: val 4 2008 int: low ?? 2012 int: high 2016 int: middle 2020 int*: a 1000 2000 int: size 6 2004 int: val 4 2008 int: low 1 2012 int: high 2016 int: middle 2020 int[]: arr ?? 1000 1004 1008 1012 1016 1020 int: size 1024 int: index 1028 int: value 1032 int[]: arr 1 1000 4 1004 7 1008 9 1012 12 1016 16 1020 int: size ?? 1024 int: index 1028 int: value 1032 int[]: arr 1 1000 4 1004 7 1008 9 1012 12 1016 16 1020 int: size 6 1024 int: index ?? 1028 int: value 1032 int[]: arr 1 1000 4 1004 7 1008 9 1012 12 1016 16 1020 int: size 6 1024 int: index 1028 int: value 1032 int[]: arr 1 1000 4 1004 7 1008 9 1012 12 1016 16 1020 int: size 6 1024 int: index ?? 1028 int: value 1032 הזיכרון של binarySearch הזיכרון של ה- main 1 2 3 4 5 1 4 7 9 12 16 binarySearch(arr, size, value); low middle high low middle high middle 22 © Keren Kalif

חיפוש בינארי – הקוד (חיפוש 10) #define NOT_FOUND -1 int binarySearch(int a[], int size, int val) { int low=0,high=size-1, middle; while (low <= high) middle = (low + high)/2; if (val == a[middle]) return middle; else if (val < a[middle]) high = middle -1; else low = middle +1; } return NOT_FOUND; void main() int arr[] = {1, 4, 7, 9, 12, 16}, index, value; int size = sizeof(arr)/sizeof(arr[0]); printf("Please enter the value to search: "); scanf("%d", &value); index = if (index == NOT_FOUND) printf("The value %d doesn't exist in the array\n", value); printf("The value %d exists in index %d\n", value, index); חיפוש בינארי – הקוד (חיפוש 10) int*: a 1000 2000 int: size 6 2004 int: val 10 2008 int: low 3 2012 int: high 5 2016 int: middle 4 2020 int*: a 1000 2000 int: size 6 2004 int: val 10 2008 int: low 4 2012 int: high 3 2016 int: middle 2020 int*: a 1000 2000 int: size 6 2004 int: val 10 2008 int: low 3 2012 int: high 5 2016 int: middle 2 2020 int*: a 1000 2000 int: size 6 2004 int: val 10 2008 int: low 3 2012 int: high 2016 int: middle 4 2020 int*: a 1000 2000 int: size 6 2004 int: val 10 2008 int: low 2012 int: high 5 2016 int: middle ?? 2020 int*: a 1000 2000 int: size 6 2004 int: val 10 2008 int: low 3 2012 int: high 2016 int: middle 2020 int*: a 1000 2000 int: size 6 2004 int: val 10 2008 int: low 2012 int: high 5 2016 int: middle 2 2020 int*: a 1000 2000 int: size 6 2004 int: val 10 2008 int: low ?? 2012 int: high 2016 int: middle 2020 int[]: arr ?? 1000 1004 1008 1012 1016 1020 int: size 1024 int: index 1028 int: value 1032 int[]: arr 1 1000 4 1004 7 1008 9 1012 12 1016 16 1020 int: size 6 1024 int: index 1- 1028 int: value 10 1032 int[]: arr 1 1000 4 1004 7 1008 9 1012 12 1016 16 1020 int: size 6 1024 int: index ?? 1028 int: value 1032 int[]: arr 1 1000 4 1004 7 1008 9 1012 12 1016 16 1020 int: size ?? 1024 int: index 1028 int: value 1032 int[]: arr 1 1000 4 1004 7 1008 9 1012 12 1016 16 1020 int: size 6 1024 int: index ?? 1028 int: value 10 1032 הזיכרון של binarySearch הזיכרון של ה- main 1 2 3 4 5 1 4 7 9 12 16 binarySearch(arr, size, value); low middle low middle high low high middle 23 © Keren Kalif

חיפוש בינארי - מימוש רקורסיבי כדי לממש את החיפוש הבינארי בקוד רקורסיבי נמצא את מרכיבי הרקורסיה בבעיה: תנאי עצירה: אם המערך בגודל 0, נחזיר NOT_FOUND קישור: אם האיבר האמצעי שווה לערך שאנו מחפשים, נחזיר את האינדקס שלו קריאה רקורסיבית: אם האיבר שאנחנו מחפשים קטן מהאיבר האמצעי, נחפש בתת-המערך השמאלי אחרת,נחפש בתת-המערך הימני 24 © Keren Kalif

חיפוש בינארי - הקוד הרקורסיבי #deine NOT_FOUND -1 int binarySearch(int arr[], int low, int high, int value) { int middle = (low + high)/2; if (low > high) return NOT_FOUND; if (value == arr[middle]) return middle; else if (value < arr[middle]) return binarySearch(arr, low, middle-1, value); else return binarySearch(arr, middle+1, high, value); } חיפוש בינארי - הקוד הרקורסיבי ניתוח זמן הריצה: O(log(size)) binS (1000, 0, 5, 4) void main() { int arr[] = {1, 4, 7, 9, 12, 16}; int size = sizeof(arr)/sizeof(arr[0]), index, value; printf("Please enter the value to search: “); scanf(“%d”, &value); index = binarySearch(arr, 0, size-1, value); if (index == NOT_FOUND) printf("The value %d doesn't exist in the array\n”, value); else printf("The value %d exists in index %d\n“, value, index); } middle=2 binS (1000, 0, 1, 4) middle=0 binS (1000, 1, 1, 4) middle=1 1 25 © Keren Kalif

מיזוג מערכים ממוינים כל עוד יש איברים בשני המערכים: נבדוק האם האיבר הנוכחי במערך הראשון קטן/שווה מהאיבר הנוכחי במערך השני: אם כן, נעתיק איבר נוכחי מהמערך הראשון לנוכחי בשלישי ונקדם את מיקום האיבר הנוכחי אחרת, נעתיק איבר נוכחי מהמערך השני לנוכחי בשלישי ונקדם את מיקום האיבר הנוכחי נעתיק את כל מה שנותר מהמערך הראשון לשלישי נעתיק את כל מה שנותר מהמערך השני לשלישי רק אחד מהם יקרה... 1 3 2 1 4 3 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 26 © Keren Kalif

מיזוג מערכים ממוינים - הקוד void mergeArrays(const int arr1[], int size1, const int arr2[], int size2, int arr3[]) { int i=0, j=0; while ( i < size1 && j < size2 ) if (arr1[i] <= arr2[j]) arr3[i+j] = arr1[i++]; else arr3[i+j] = arr2[j++]; while ( i < size1) // copy rest of arr1 while ( j < size2) // copy rest of arr2 1 3 i = 2 i = 0 i = 1 j = 2 j = 3 j = 1 j = 0 arr1: 2 1 4 3 arr2: 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 4 3 2 1 arr3: ניתוח זמן ריצה: O(size1 + size2) 27 © Keren Kalif

מיזוג מערכי מחרוזות ממוינים מיזוג מערכי מחרוזות ממוינים void mergeArrays(const char arr1[][LEN], int size1, const char arr2[][LEN], int size2, char arr3[][LEN]) { int i=0, j=0; while ( i < size1 && j < size2 ) } if ( strcmp(arr1[i], arr2[j]) <= 0 ) strcpy(arr3[i+j], arr1[i]); i++; else strcpy(arr3[i+j], arr2[j]); j++; while ( i < size1) // copy rest of arr1 } strcpy(arr3[i+j], arr1[i]); i++; { while ( j < size2) // copy rest of arr2 strcpy(arr3[i+j], arr2[j]); j++; 28 © Keren Kalif

ביחידה זו למדנו: מהו מיון מוטיבציה למיון מיון בועות (Bubble Sort) מיון בסדר עולה, מיון בסדר יורד, מיון טקסט Selection Sort Insertion Sort חיפוש בינארי מימוש איטרטיבי מימוש רקורסיבי מיזוג מערכים ממוינים 29 © Keren Kalif

תרגיל 1: כתוב פונקציה המקבלת מטריצה ריבועית, אשר תמיין את ערכי האלכסון הראשי מהקטן לגדול דוגמא: עבור המטריצה יש לעדכנה להיות הפתרון יוצג בפתרון בועות, אתם יכולים למיין בכל אלגוריתם אחר 30 © Keren Kalif

תרגיל 2: כתוב פונקציה המקבלת מחרוזת הכוללת אותיות קטנות וגדולות הפונקציה תמיין את אותיות המחרוזת מהאות הקטנה לגדולה, אך לא תבדיל בין אותיות גדולות לקטנות דוגמאות: עבור המחרוזת zBa הפונקציה תמיין אותה להיות aBz עבור הפונקציה zZaAC הפונקציה תמיין אותה להיות aACzZ הנחה: כאשר יש אות גדולה וקטנה זהה, לא משנה מי תופיע קודם הפתרון יוצג במיון Selection Sort, אתם יכולים למיין בכל אלגוריתם אחר 31 © Keren Kalif

תרגיל 3: כתוב פונקציה המקבלת מטריצה ריבועית שעמודותיה ממוינות וערך לחיפוש. הפונקציה תחזיר את השורה והעמודה בה נמצא הערך, הוא תשים בערכם 1- אם הערך אינו קיים. למשל, המטריצה הבאה והערך 7: הפונקציה תחזיר שורה 2 ועמודה 1 כי במיקום זה קיים הערך 7 32 © Keren Kalif