Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 3

2,871 views

Published on

.

Published in: Education
  • Be the first to comment

ΑΛΓΟΡΙΘΜΟΙ ΣΕ C - ΜΑΘΗΜΑ 3

  1. 1. Αλγόριθµοι σε C Μάθηµα 3: Ταξινόµηση Πίνακα ∆ηµήτρης Ψούνης
  2. 2. Περιεχόµενα Μαθήµατος Α. Θεωρία 1. Ταξινόµηση Πίνακα 1. Ορισµός του Προβλήµατος 2. Ταξινόµηση µε Εισαγωγή 1. Ιδέα του Αλγορίθµου 2. Κώδικας σε C 3. Παράδειγµα Εκτέλεσης 4. Άσκηση 3. Ταξινόµηση µε Επιλογή 1. Ιδέα του Αλγορίθµου 2. Κώδικας σε C 3. Παράδειγµα Εκτέλεσης 4. Άσκηση 4. Ταξινόµηση Φυσαλίδας 1. Ιδέα του Αλγορίθµου 2. Κώδικας σε C 3. Παράδειγµα Εκτέλεσης 4. Άσκηση 2∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 5. Ταξινόµηση µε Συγχώνευση 1. Ιδέα του Αλγορίθµου 2. Κώδικας σε C 3. Παράδειγµα Εκτέλεσης 4. Η merge 5. Άσκηση 6. Γρήγορη Ταξινόµηση 1. Ιδέα του Αλγορίθµου 2. Κώδικας σε C 3. Παράδειγµα Εκτέλεσης 4. Άσκηση Β. Ασκήσεις
  3. 3. A. Θεωρία 1. Αναζήτηση Στοιχείου σε Πίνακα 1. Ορισµός του Προβλήµατος 3∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Η «Ταξινόµηση Πίνακα» είναι το υπολογιστικό πρόβληµα στο οποίο: • Είσοδος: Ένας Πίνακας Στοιχείων • Έξοδος: Ο ίδιος Πίνακας µε τα στοιχεία του Ταξινοµηµένα Τα στοιχεία ταξινοµούνται: Σε αύξουσα σειρά (από το µικρότερο στο µεγαλύτερο) [Σηµείωση: Θα µελετήσουµε την ταξινόµηση σε αύξουσα σειρά στη θεωρία] Σε φθίνουσα σειρά (από το µεγαλύτερο στο µικρότερο) Θα µελετήσουµε 5 αλγόριθµους: Την Ταξινόµηση µε Επιλογή (Selection Sort) Την Ταξινόµηση µε Εισαγωγή (Insertion Sort) Την Ταξινόµηση Φυσαλίδας (Bubble Sort) Την Ταξινόµηση µε Συγχώνευση (Merge Sort) Την Γρήγορη Ταξινόµηση (Quick Sort)
  4. 4. A. Θεωρία 2. Ταξινόµηση µε Επιλογή (Selection Sort) 1. Αλγοριθµική Ιδέα ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 4 Ι∆ΕΑ της Selection Sort: • Έχοντας ταξινοµήσει τα στοιχεία 0..i-1 • επέλεξε το ελάχιστο ανάµεσα στα i έως N-1 και τοποθέτησε το στην θέση i 1 3 … 8 14 15 32 9 … 19 Ταξινοµηµένος Αταξινόµητος 1 swap 2 Υλοποίηση: • Στο βήµα i (0UN-1) • Βρίσκω το ελάχιστο στις θέσεις i..N-1 • Το κάνω swap µε το στοιχείο στη θέση i
  5. 5. Ακολουθεί ο κώδικας σε C: Ο pinakas είναι ένας πίνακας Ν ακεραίων: A. Θεωρία 2. Ταξινόµηση µε Επιλογή (Selection Sort) 2. Κώδικας σε C 5∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα /* Taksinomisi Selection Sort */ for (i=0; i<N; i++) { pos=i; for (j=i+1; j<N; j++) { if (pinakas[j]<pinakas[pos]) pos=j; } swap(&pinakas[i], &pinakas[pos]); }
  6. 6. A. Θεωρία 2. Ταξινόµηση µε Εισαγωγή (Insertion Sort) 3. Ένα Παράδειγµα Εκτέλεσης ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 6 9 2 4 7 1 8 6 3i=0: 1 2 4 7 9 8 6 3i=1: 1 2 4 7 9 8 6 3i=2: 1 2 3 7 9 8 6 4i=3: 1 2 3 4 9 8 6 7i=4: 1 2 3 4 6 8 9 7i=5: 1 2 3 4 6 7 9 8i=6: 1 2 3 4 6 7 8 9i=7: Αρχικός Πίνακας: 9 2 4 7 1 8 6 3 Τελικός Πίνακας: 1 2 3 4 6 7 8 9
  7. 7. A. Θεωρία 2. Ταξινόµηση µε Επιλογή (Selection Sort) 4. Άσκηση 7∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αφού µελετήσετε το πρόγραµµα selection_sort.c κατασκευάσετε συνάρτηση που παίρνει ως όρισµα έναν πίνακα ακεραίων (και τη διάστασή του) και τον ταξινοµεί µε χρήση της selection sort.
  8. 8. A. Θεωρία 3. Ταξινόµηση µε Εισαγωγή (Insertion Sort) 1. Αλγοριθµική Ιδέα ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 8 Ι∆ΕΑ της Insertion Sort: • Έχοντας ταξινοµήσει τα στοιχεία 0..i-1 • Τοποθετεί το στοιχείο i ταξινοµηµένα στις θέσεις 0..i (µε ανταλλαγές µέχρι να βρει µικρότερο) 1 3 … 7 14 15 9 32 … 4 Ταξινοµηµένος Αταξινόµητος swap Υλοποίηση: • Στο βήµα i (1UN-1) • Κάνω συνεχή swap του στοιχείου i αριστερά, µέχρι να βρω κάποιο µικρότερο στοιχείο swap
  9. 9. Ακολουθεί ο κώδικας σε C: Ο pinakas είναι ένας πίνακας Ν ακεραίων: A. Θεωρία 3. Ταξινόµηση µε Εισαγωγή (Insertion Sort) 2. Κώδικας σε C 9∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα /* Taksinomisi me Eisagogi */ for (i=1; i<N; i++) { for (j=i; j>=1; j--) { if (pinakas[j]<pinakas[j-1]) swap(&pinakas[j], &pinakas[j-1]); else break; } }
  10. 10. A. Θεωρία 3. Ταξινόµηση µε Εισαγωγή (Insertion Sort) 3. Ένα Παράδειγµα Εκτέλεσης ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 10 9 2 4 7 1 8 6 3i=1: 2 9 4 7 1 8 6 3i=2: 2 4 9 7 1 8 6 3i=3: 2 4 7 9 1 8 6 3i=4: 1 2 4 7 9 8 6 3i=5: 1 2 4 7 8 9 6 3i=6: 1 2 4 6 7 8 9 3i=7: Αρχικός Πίνακας: 9 2 4 7 1 8 6 3 Τελικός Πίνακας: 1 2 3 4 6 7 8 9
  11. 11. A. Θεωρία 3. Ταξινόµηση µε Εισαγωγή (Insertion Sort) 4. Άσκηση 11∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αφού µελετήσετε το πρόγραµµα insertion_sort.c κατασκευάσετε συνάρτηση που παίρνει ως όρισµα έναν πίνακα ακεραίων (και τη διάστασή του) και τον ταξινοµεί µε χρήση της insertion sort.
  12. 12. A. Θεωρία 4. Ταξινόµηση Φυσαλίδας (Bubble Sort) 1. Αλγοριθµική Ιδέα ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 12 Ι∆ΕΑ της Bubble Sort: • Έχοντας ταξινοµήσει τα στοιχεία 0..i-1 • Τα ελαφρύτερα (µικρότερα) στοιχεία αναδύονται µε µία σάρωση στις θέσεις Ν-1Ui 1 … 5 12 14 15 7 11 … 8 Ταξινοµηµένος Αταξινόµητος Υλοποίηση: • Στο βήµα i (0UN-1) • Για j=N-1 έως i+1: Κάνω swap του PIN[j] µε το PIN[j-1] εάν PIN[j]<PIN[j-1]
  13. 13. Ακολουθεί ο κώδικας σε C: Ο pinakas είναι ένας πίνακας Ν ακεραίων: A. Θεωρία 4. Ταξινόµηση Φυσαλίδας(Bubble Sort) 2. Κώδικας σε C 13∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα /* Taksinomisi Fysalidas */ for (i=0; i<N; i++) { for (j=N-1; j>=i+1; j--) { if (pinakas[j]<pinakas[j-1]) swap(&pinakas[j], &pinakas[j-1]); } }
  14. 14. A. Θεωρία 4. Ταξινόµηση Φυσαλίδας(Bubble Sort) 3. Ένα Παράδειγµα Εκτέλεσης ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 14 9 2 4 7 1 8 6 3i=0: 1 9 2 4 7 3 8 6i=1: 1 2 9 3 4 7 6 8i=2: 1 2 3 9 4 6 7 8i=3: 1 2 3 4 9 6 7 8i=4: 1 2 3 4 6 9 7 8i=5: 1 2 3 4 6 7 9 8i=6: 1 2 3 4 6 7 8 9i=7: Αρχικός Πίνακας: 9 2 4 7 1 8 6 3 Τελικός Πίνακας: 1 2 3 4 6 7 8 9
  15. 15. A. Θεωρία 4. Ταξινόµηση Φυσαλίδας(Bubble Sort) 4. Άσκηση 15∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αφού µελετήσετε το πρόγραµµα bubble_sort.c κατασκευάσετε συνάρτηση που παίρνει ως όρισµα έναν πίνακα ακεραίων (και τη διάστασή του) και τον ταξινοµεί µε χρήση της bubble sort.
  16. 16. A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 1. Αλγοριθµική Ιδέα ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 16 Ι∆ΕΑ της Merge Sort: 1. (Αναδροµικά) Ταξινόµησε το αριστερό µισό του πίνακα 2. (Αναδροµικά) Ταξινόµησε το δεξί µισό του πίνακα 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 1 4 6 7 9 11 18 20 8 9 10 11 12 13 14 15 2 3 5 10 13 14 19 22 3. Συγχώνευσε τα δύο κοµµάτια σε µία ταξινοµηµένη ακολουθία 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 9 0 1 2 3 4 5 6 7 1 4 6 7 9 11 18 20 8 9 10 11 12 13 14 15 2 3 5 10 13 14 19 22
  17. 17. Το σώµα του αλγορίθµου φαίνεται στον ακόλουθο κώδικα (o πίνακας έχει δηλωθεί ως int pinakas[N] και οι µεταβλητές start,finish, middle είναι ακέραιες µεταβλητές): A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 1. Αλγοριθµική Ιδέα 17∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα void mergesort(int *pinakas, int start, int finish) { int i,middle; if (start==finish) /* 1 stoixeio */ return; else if (start==finish-1) /* 2 stoixeia */ { if (pinakas[start]>pinakas[finish]) swap(&pinakas[start], &pinakas[finish]); } else { middle=(start+finish)/2; mergesort(pinakas,start,middle); mergesort(pinakas,middle+1,finish); merge(pinakas,start,finish); } }
  18. 18. 18∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Πίνακας προς ταξινόµηση: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 9 10 13 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  19. 19. 19∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση MergeSort(Α,0,15) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  20. 20. 20∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,0,7) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 18 7 4 11 4 5 6 7 9 20 6 1 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  21. 21. 21∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,0,3) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 18 7 4 11 4 5 6 7 9 20 6 1 0 1 18 7 3 4 4 11 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  22. 22. 22∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,0,1): Ταξινοµηση του υποπίνακα 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 18 7 4 11 4 5 6 7 9 20 6 1 0 1 7 18 2 3 4 11 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  23. 23. 23∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,2,3): Ταξινοµηση του υποπίνακα 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 18 7 4 11 4 5 6 7 9 20 6 1 0 1 7 18 2 3 4 11 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  24. 24. 24∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,0,3): Συγχώνευση των δύο υποπινάκων 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 4 7 11 18 4 5 6 7 9 20 6 1 0 1 7 18 2 3 4 11 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  25. 25. 25∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,4,7) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 4 7 11 18 4 5 6 7 9 20 6 1 0 1 7 18 2 3 4 11 4 5 9 20 6 7 6 1 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  26. 26. 26∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,4,5): Ταξινοµηση του υποπίνακα 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 4 7 11 18 4 5 6 7 9 20 6 1 0 1 7 18 2 3 4 11 4 5 9 20 6 7 6 1 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  27. 27. 27∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,6,7): Ταξινοµηση του υποπίνακα 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 4 7 11 18 4 5 6 7 9 20 6 1 0 1 7 18 2 3 4 11 4 5 9 20 6 7 1 6 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  28. 28. 28∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,4,7): Συγχώνευση των δύο υποπινάκων 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 18 7 4 11 9 20 6 1 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 4 7 11 18 4 5 6 7 1 6 9 20 0 1 7 18 2 3 4 11 4 5 9 20 6 7 1 6 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  29. 29. 29∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,0,7): Συγχώνευση των δύο υποπινάκων 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 1 4 6 7 9 11 18 20 8 9 10 11 12 13 14 15 22 19 14 5 2 3 10 13 0 1 2 3 4 7 11 18 4 5 6 7 1 6 9 20 0 1 7 18 2 3 4 11 4 5 9 20 6 7 1 6 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  30. 30. 30∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αντίστοιχα θα γίνουν όλες οι αναδροµικές κλήσεις στο (8,15) 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 2 3 10 13 0 1 2 3 4 5 6 7 1 4 6 7 9 11 18 20 8 9 10 11 12 13 14 15 2 3 5 10 13 14 19 22 0 1 2 3 4 7 11 18 4 5 6 7 1 6 9 20 0 1 7 18 2 3 4 11 4 5 9 20 6 7 1 6 8 9 10 11 5 14 19 22 12 13 14 15 2 3 10 13 8 9 19 22 10 11 5 14 12 13 2 3 14 15 10 13 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  31. 31. 31∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Αναδροµική Κλήση (A,0,15): Συγχώνευση των δύο υποπινάκων 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 9 10 11 13 14 18 19 20 22 0 1 2 3 4 5 6 7 1 4 6 7 9 11 18 20 8 9 10 11 12 13 14 15 2 3 5 10 13 14 19 22 0 1 2 3 4 7 11 18 4 5 6 7 1 6 9 20 0 1 7 18 2 3 4 11 4 5 9 20 6 7 1 6 8 9 10 11 5 14 19 22 12 13 14 15 2 3 10 13 8 9 19 22 10 11 5 14 12 13 2 3 14 15 10 13 A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 3. Ένα Παράδειγµα Εκτέλεσης
  32. 32. 32∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Η διαδικασία merge δουλεύει ως εξής: Σαρώνει τους δύο πίνακες ταυτόχρονα από αριστερά προς τα δεξιά. Συγκρίνει τα δύο τρέχοντα στοιχεία των πινάκων Επιλέγει το µικρότερο και το βάζει στην επόµενη θέση της ταξινοµηµένης ακολουθίας Όταν εξαντληθούν τα στοιχεία του ένος από τους δύο πίνακες, βάζουµε όσα στοιχεία απέµειναν από τον άλλο πίνακα στο τέλος της ταξινοµηµένης ακολουθίας. Στο παράδειγµα βλέπουµε µερικά βήµατα και τους µετρητές που χρησιµοποιούνται. A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 4. Η διαδικασία merge
  33. 33. 33∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα
  34. 34. 34∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Μία υλοποίηση της merge είναι η ακόλουθη: void merge(int *pinakas, int start, int finish) { int C[SIZE]; int i,j,k; int middle, n, m; middle=(start+finish)/2; /* 1os pinakas PIN[start..middle]=PIN[i..n] */ i=start; n=middle; /* 2os pinakas PIN[middle+1..finish]=PIN[j...m] */ j=middle+1; m=finish; /* C: sigxwneumenos pinakas */ k=0; A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 4. Η διαδικασία merge (συνεχίζεται…)
  35. 35. 35∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Μία υλοποίηση της merge είναι η ακόλουθη: (συνέχεια…) /* 1. Sigxwneusi twn dio pinakwn */ while (i<=n && j<=m) { if (pinakas[i]<pinakas[j]) { C[k]=pinakas[i]; k++; i++; } else { C[k]=pinakas[j]; k++; j++; } } A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 4. Η διαδικασία merge (συνεχίζεται…)
  36. 36. 36∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Μία υλοποίηση της merge είναι η ακόλουθη: (συνέχεια…) /* 2. Antigrafi tou pinaka pou perissevei sto telos tou sigxwneumenou pinaka */ if (i==n+1) /* Eksantlithike o 1os pinakas */ { while (j<=m) { C[k]=pinakas[j]; k++; j++; } } else /* Eksantlithike o 2os pinakas */ { while (i<=n) { C[k]=pinakas[i]; k++; i++; } } A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 4. Η διαδικασία merge (συνεχίζεται…)
  37. 37. 37∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Μία υλοποίηση της merge είναι η ακόλουθη: (συνέχεια…) /* 3. Antigrafi tou C ston pinakas */ k=0; i=start; while (i<=finish) { pinakas[i]=C[k]; i++; k++; } } A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 4. Η διαδικασία merge (συνεχίζεται…)
  38. 38. 38∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Άσκηση: Μελετήστε το πρόγραµµα mergesort.c και “καθαρίστε” το από τις εκτυπώσεις ώστε η mergesort να είναι µια αυτόνοµη συνάρτηση. A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 5. Άσκηση
  39. 39. A. Θεωρία 6. Γρήγορη Ταξινόµηση (Quick Sort) 1. Ιδέα του Αλγορίθµου 39∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Ι∆ΕΑ της QuickSort: 1. Επιλέγει ένα Στοιχείο του Πίνακα (Οδηγό Στοιχείο – Εδώ το στοιχείο που είναι στην πρώτη θέση) 2. Χωρίζει τον πίνακα σε τρία µέρη: • Τα στοιχεία που είναι µικρότερα του οδηγού στοιχείου • Το οδηγό στοιχείο • Τα στοιχεία που είναι µεγαλύτερα ή ίσα του οδηγού στοιχείου 0 1 2 3 4 5 6 7 8 9 18 7 4 11 9 20 6 1 22 19 6 7 4 11 9 1 18 20 22 19 7 8 9 20 22 19 3. Επαναλαµβάνει αναδροµικά στους δύο υποπίνακες που προέκυψαν. 6 18 0 1 2 3 4 5 6 7 4 11 9 1
  40. 40. A. Θεωρία 6. Γρήγορη Ταξινόµηση (Quick Sort) 2. Κώδικας σε C 40∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Η υλοποίηση σε γλώσσα C είναι η ακόλουθη: Όπου partition είναι µια συνάρτηση που πραγµατοποιεί τον χωρισµό του πίνακα σε µικρότερα και µεγαλύτερα (ή ίσα) στοιχεία σε σχέση µε το οδηγό στοιχείο. Επιστρέφει τη θέση του τελευταίου µικρότερου στοιχείου από το οδηγό στοιχείο. Συνεπώς οι δύο πίνακες στους οποίους γίνεται η αναδροµή είναι: start..pos pos+1..finish Στην επόµενη διαφάνεια βλέπουµε ένα παράδειγµα εκτέλεσης. void quicksort(int *pinakas, int start, int finish) { int pos; if (start<finish) { pos=partition(pinakas,start,finish); quicksort(pinakas,start,pos-1); quicksort(pinakas,pos+1,finish); } }
  41. 41. Γρήγορη Ταξινόµηση QuickSort (3.Παράδειγµα Εκτέλεσης) 41∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 18 7 4 11 9 20 6 1 22 19 14 5 8 3 10 13 8 7 4 11 9 13 6 1 10 3 14 5 18 19 22 20 0 1 2 3 4 5 6 7 8 9 10 11 8 7 4 11 9 13 6 1 10 3 14 5 6 7 4 5 3 1 8 13 10 9 14 11 13 14 15 19 22 20 19 22 20 14 15 22 20 20 22 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 3 4 5 6 7 8 9 10 11 13 14 18 19 20 22 0 1 2 3 4 5 6 7 4 5 3 1 3 1 4 5 6 7 7 8 9 10 11 13 10 9 14 11 11 10 9 13 14 5 7 7 0 1 2 3 3 1 4 5 1 3 4 5 0 1 1 2 3 4 5 4 5 3 5 5 7 8 9 11 10 9 9 10 11 11 14 14 7 8 9 10 9 10 8 10 10 14 20 20
  42. 42. 42∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Η διαµέριση των στοιχείων στα µικρότερα και µεγαλύτερα ή ίσα µπορεί να γίνει µε πολλούς τρόπους: Π.χ. ένας απλός τρόπος είναι να χρησιµοποιήσουµε έναν βοηθητικό πίνακα που να βάζουµε στα αριστερά τα µικρότερα στοιχεία και στα δεξιά τα µεγαλύτερα στοιχεία του οδηγού. Ωστόσο εµείς θα µελετήσουµε έναν τρόπο διαµέρισης, που είναι µια µικρή παραλλαγή του σχήµατος Hoare: Σαρώνουµε τον πίνακα από αριστερά ψάχνοντας για ένα στοιχείο που είναι µεγαλύτερο του οδηγού Σαρώνουµε τον πίνακα από δεξιά ψάχνοντας για ένα στοιχείο που είναι µικρότερο (ή ίσο) του οδηγού Ανταλλάσσουµε τα δύο στοιχεία και επαναλαµβάνουµε µέχρι να γίνει ο χωρισµός των στοιχείων. Μελετούµε το παράδειγµα της επόµενης διαφάνειας A. Θεωρία 6. Γρήγορη Ταξινόµηση (Quick Sort) 4. Η διαδικασία partition
  43. 43. Παράδειγµα εκτέλεσης της partition: Τερµατισµός: Ανταλλαγή του οδηγού στοιχείου µε το «δεξιό» δείκτη A. Θεωρία 6. Γρήγορη Ταξινόµηση (Quick Sort) 4. Η διαδικασία partition 43∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 0 1 2 3 4 5 6 7 8 9 9 8 4 11 2 20 6 1 22 19 i=3 j=8 0 1 2 3 4 5 6 7 8 9 9 8 4 11 2 20 6 1 22 19 8 4 1 11 22 19 0 1 2 3 4 5 6 7 8 9 9 8 4 1 2 20 6 11 22 19 9 8 4 1 11 22 19i=5 j=6 0 1 2 3 4 5 6 7 8 9 9 8 4 1 2 6 20 11 22 19 0 1 2 3 4 5 6 7 8 9 9 8 4 1 2 20 6 11 22 19 9 8 4 1 2 6 20 11 22 19 i=7j=6 0 1 2 3 4 5 6 7 8 9 9 8 4 1 2 6 20 11 22 19 0 1 2 3 4 5 6 7 8 9 6 8 4 1 2 9 20 11 22 19
  44. 44. A. Θεωρία 6. Γρήγορη Ταξινόµηση (Quick Sort) 4. Η διαδικασία partition 44∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Η υλοποίηση της partition µε το σχήµα του Hoare σε ψευδογλώσσα είναι η ακόλουθη: int partition(int *pinakas, int start, int finish) { int pivot, i, j; pivot=pinakas[start]; i=start+1; j=finish; while(1) { while(pinakas[i]<=pivot && i<=finish) i++; while(pinakas[j]>pivot && j>=start) j--; if (i<j) swap(&pinakas[i],&pinakas[j]); else { swap(&pinakas[start],&pinakas[j]); return j; } } }
  45. 45. A. Θεωρία 6. Γρήγορη Ταξινόµηση (Quick Sort) 5. Άσκηση 45∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα Άσκηση: Μελετήστε το πρόγραµµα quicksort.c και “καθαρίστε” το από τις εκτυπώσεις ώστε η quicksort να είναι µια αυτόνοµη συνάρτηση.
  46. 46. Β. Ασκήσεις Εφαρµογή 1: Ταξινόµηση Πραγµατικών Αριθµών ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 46 Μετατρέψτε την bubble sort και την quick sort έτσι ώστε να πραγµατοποιούν ταξινόµηση σε τύπο δεδοµένων double.
  47. 47. Β. Ασκήσεις Εφαρµογή 2: Ταξινόµηση σε Φθίνουσα Σειρά ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 47 Μετατρέψτε την insertion sort και την merge sort έτσι ώστε να πραγµατοποιούν ταξινόµηση σε φθίνουσα σειρά.
  48. 48. Β. Ασκήσεις Εφαρµογή 3: Quick Sort που χρησιµοποιεί Insertion Sort ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 48 Προτείνεται η εξής υβριδική µέθοδος ταξινόµησης: Εκτελούµε τον αλγόριθµο Quick Sort Αν ωστόσο ο πίνακας έχει το πολύ 5 στοιχεία, τότε αυτός ταξινοµείται µε χρήση της insertion sort Κατασκευάστε την νέα µέθοδο ταξινόµησης µε όνοµα hybrid sort και αναδείξτε τη χρήση της µε µία κατάλληλη συνάρτηση main.
  49. 49. Β. Ασκήσεις Εφαρµογή 4.1: Εκτέλεση όλων των αλγορίθµων ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 49 ∆ηµιουργήστε ένα πρόγραµµα το οποίο: ∆ηµιουργείται ένας πίνακας 100 ακεραίων αριθµών. Οι τιµές του πίνακα να είναι ακέραιοι στο εύρος [0U1000] Καλούνται διαδοχικά οι 5 αλγόριθµοι ταξινόµησης που µελετήσαµε και προβάλλεται το αποτέλεσµα της ταξινόµησης του πίνακα.
  50. 50. Β. Ασκήσεις Εφαρµογή 4.2: Πλήθος Συγκρίσεων των Αλγορίθµων Αναζήτησης ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 50 Τροποποιήστε τους 3 µη αναδροµικούς αλγορίθµους, ώστε να µετράνε το πλήθος των συγκρίσεων που πραγµατοποιούνται. Μετά την εκτέλεση του αντίστοιχου αλγορίθµου να τυπώνεται το πλήθος των συγκρίσεων που πραγµατοποιήθηκαν. Σηµείωση: Όταν λέµε συγκρίσεις εννοούµε τις συγκρίσεις που γίνονται µεταξύ στοιχείων του πίνακα.
  51. 51. Β. Ασκήσεις Εφαρµογή 4.3: Πλήθος Συγκρίσεων των Αλγορίθµων Αναζήτησης ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 51 Τροποποιήστε τους 2 αναδροµικούς αλγορίθµους, ώστε να µετράνε το πλήθος των συγκρίσεων που πραγµατοποιούνται. Μετά την εκτέλεση του αντίστοιχου αλγορίθµου να τυπώνεται το πλήθος των συγκρίσεων που πραγµατοποιήθηκαν. Σηµείωση: Όταν λέµε συγκρίσεις εννοούµε τις συγκρίσεις που γίνονται µεταξύ στοιχείων του πίνακα.
  52. 52. Β. Ασκήσεις Εφαρµογή 4.4: Πειραµατική Μελέτη των Αλγορίθµων Αναζήτησης ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 52 Πειραµατιστείτε δοκιµάζοντας διαφορετικές διαστάσεις στον πίνακα. Ποιος αλγόριθµος δείχνει να επικρατεί των άλλων;

×