Download presentation
Presentation is loading. Please wait.
1
מבוא למדעי המחשב הרצאה 6: מיונים
2
הדפסת מערך לא ניתן להשתמש ב הדפסה ישירה!
public static void printArray(int[] arr) { for (int i=0; i<arr.length; i=i+1) System.out.print("["+arr[i]+"]"); System.out.println(); // new line } הסבר על void - חזרה ל main
3
מיון בחירה: אלגוריתם מיון selection: קבל מערך (באורך n)
לולאה i = 0 עד 2-n: בחר את האינדקס (minInd) של האיבר הקטן ביותר בתחום [i,n-1] החלף את האיבר ה i עם האיבר minInd לפני שכותבים את האלגוריתם על הלוח אני מציע: מיון בחירה הוא המיון הטבעי ביותר, וזה מוסיף מאוד להבנה של הסטודנטים אם הם רואים שזה בעצם המיון שהם מתשמשים בו בעצמם מאז שהם ילדים. על כן, אני מתכוון להשתמש בשישה בריסטולים מודבקים ללוח המייצגים מערך לא ממויין, ולתת לאחד הסטודנטים לעלות אל הלוח ולמיין את המערך בשיטה שבא לו. נותנים לו גם אפשרות להעביר בריסטול למקום חיצוני למערך שנקרא temp. אסור לו להחזיק 2 בריסטולים ביד בו זמנית. מה שהסטודנט ייבצע (לרוב) זה מיון בחירה. תוך כדי עבודת הסטודנט (בהתחלה הוא בוחר את המינימום) מפרשנים מה הוא עושה, שזה בעצם 2 צעדים: בוחר את המינימום ומחליף עם האיבר ה-i. תוך כדי עבודתו ניתן לצייר קו שמשמאלו החלק הממוין של המערך ומימינו מה שעוד לא מוין. פעילות דומה (שתפורט בהמשך נבצע גם עם מיון הכנסה). יש לציין שלאחר ההדגמה של הסטודנט לא נדרשת ריצת הדגמה נוספת של הקוד. רצוי שהמספרים על הבריסטולים יתאימו לדוגמא בשקפים, כלומר: 45,21,52,61,9,15 (בסדר הזה). לחילופין ניתן להשתמש בקלפים. שאלות לסטודנטים: א. מדוע הלולאה רצה רק עד n-2? תשובה: כי האיבר האחרון ממילא יהיה כבר הגדול ביותר במערך – אין מה להחליף. ב. לאילו פונקציות ניתן לחלק את אלגוריתם המיון? תשובה: minIndex, swap. ג. מהי הטענה הנשמרת (invariant) באלגוריתם? תשובה: כל האיברים עד i(לא כולל) ממוינים וגם כל האיברים החל מ i (כולל) גדולים מהאיברים עד i (לא כולל)
4
מיון בחירה (קוד): public static void main(String[] args) {
int len = 10; int[] arr = new int[len]; for(int i=0 ; i<len ; i=i+1) arr[i] = (int)(Math.random()*101); printArray(arr); // prints the array nicely selectionSort(arr); printArray(arr); // prints the (sorted) array }
5
מיון בחירה (קוד): public static void selectionSort(int[] arr) {
תנאי קדם: i = 0, arr.length>0 public static void selectionSort(int[] arr) { for(int i=0; i<arr.length-1; i=i+1) { int minInd = minIndex(arr, i); swap(arr, i, minInd); } טענה נשמרת: קבוצת האיברים [0..i-1] ממוינת וגם כל האיברים בקבוצה [i..arr.length-1] גדולים (או שווים) מהאיברים בקבוצה[0..i-1] וגם i≤arr.length-1 לדבר על הוכחת נכונות, טענה נשמרת תנאי קדם: i=0 טענה נשמרת: קבוצת האיברים [0..i-1] ממוינת וגם כל האיברים בקבוצה [i..arr.length-1] גדולים (או שווים) מהאיברים בקבוצה וגם i≤arr.length-1 [0..i-1] תנאי בתר: המערך ממוין להוכיח תנאי בתר: המערך ממוין
6
מיון בחירה (קוד): // finds the minimum entry index starting at index from public static int minIndex(int[] arr, int from) { int ans = from; for(int i =from+1; i<arr.length; i=i+1) if (arr[ans] > arr[i]) ans = i; return ans; }
7
מיון בחירה (קוד): public static void swap(int[] arr, int i, int j) {
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } להראות מה קורה בזיכרון – שאיברי המערך אכן משתנים
8
מיון בחירה: ניתוח זמן ריצה
n n-1 n-2 n-3 ~ n2 n(n-1)/2 ניתוח זמן הריצה של כל פונקציה 2 1
9
SWAP לשני פרימיטיביים: בלתי אפשרי!
public static void swap(int i, int j) { int tmp = i; i = j; j = tmp; } swap (arr[x],arr[y]) לא משנה את איברי המערך
10
מיון הכנסה קלט: מערך באורך n לולאה i=1עד :n-1
לפני שכותבים את האלגוריתם על הלוח אני מציע: מיון הכנסה הוא המיון הטבעי ביותר כאשר מגלים לנו כל פעם איבר חדש (עושים את זה כשמשחקים קלפים), וזה מוסיף מאוד להבנה של הסטודנטים אם הם רואים שזה בעצם המיון שהם משתמשים בו בעצמם מאז שהם ילדים. לכן, ניתן להשתמש שוב בבריסטולים, רק הפעם להתחיל כשהם הפוכים וכל פעם לגלות את הבריסטול השמאלי ביותר (שעדיין מוסתר). 10
11
מיון הכנסה (קוד) public static void insertionSort(int [] arr) {
for (int i = 1; i<arr.length; i = i+1) insert(arr, i); } תנאי קדם: i=1 טענה נשמרת: קבוצת האיברים [0..i-1] ממוינת וגם i≤arr.length להסביר מדוע לא מתחילים ב-0 תנאי קדם: i=1 טענה נשמרת: קבוצת האיברים [0..i-1] ממוינת וגם i≤arr.length תנאי בתר: המערך ממוין לדבר על הוכחת נכונות, אך לא להוכיח תנאי בתר: המערך ממוין 11
12
המשך: public static void insert(int[] arr, int i) {
int value = arr[i]; while (i > 0 && arr[i-1] > value) { arr[i] = arr[i-1]; i = i-1; } arr[i] = value; Talk about & vs. && And | vs. || 12
13
מיון הכנסה: ניתוח זמן ריצה
המקרה הגרוע ביותר: מערך ממוין בסדר יורד: n 1 2 3 ~ n2 n(n-1)/2 n-1 13
14
מיון הכנסה: ניתוח זמן ריצה
n-1 calls to insert() up to n-1 items shifted per call to insert() ~ n2 Worst case scenario: 4,3,2,1 in which case you get an algebric sum, as in the selection sort. אבל במקרה הטוב כשהמערך ממויין, זמן הריצה הוא n "האמת" (הממוצע) היא איפשהו באמצע, ולכן באופן כללי, מיון הכנסה הוא יעיל יותר ממיון בחירה נהוג לספור השוואות כשמנתחים את זמן הריצה של אלגוריתמי מיון 14
15
In Situ כשאומרים על אלגוריתם למיון שהוא In Situ (מלטינית), הכוונה היא שהאלגוריתם לא נזקק לזיכרון נוסף מעבר למערך אותו הוא ממיין מיון בחירה ומיון הכנסה הם שניהם In Situ 15
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.