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

52
Αλγόριθµοι σε C Μάθηµα 3: Ταξινόµηση Πίνακα ∆ηµήτρης Ψούνης

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

Αλγόριθµοι σε C

Μάθηµα 3:

Ταξινόµηση Πίνακα

∆ηµήτρης Ψούνης

Περιεχόµενα Μαθήµατος Α. Θεωρία

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. Άσκηση

Β. Ασκήσεις

A. Θεωρία 1. Αναζήτηση Στοιχείου σε Πίνακα 1. Ορισµός του Προβλήµατος

3 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα

Η «Ταξινόµηση Πίνακα» είναι το υπολογιστικό πρόβληµα στο οποίο:

• Είσοδος: Ένας Πίνακας Στοιχείων

• Έξοδος: Ο ίδιος Πίνακας µε τα στοιχεία του Ταξινοµηµένα

Τα στοιχεία ταξινοµούνται:

Σε αύξουσα σειρά (από το µικρότερο στο µεγαλύτερο) [Σηµείωση: Θα µελετήσουµε την

ταξινόµηση σε αύξουσα σειρά στη θεωρία]

Σε φθίνουσα σειρά (από το µεγαλύτερο στο µικρότερο)

Θα µελετήσουµε 5 αλγόριθµους:

Την Ταξινόµηση µε Επιλογή (Selection Sort)

Την Ταξινόµηση µε Εισαγωγή (Insertion Sort)

Την Ταξινόµηση Φυσαλίδας (Bubble Sort)

Την Ταξινόµηση µε Συγχώνευση (Merge Sort)

Την Γρήγορη Ταξινόµηση (Quick Sort)

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

Ακολουθεί ο κώδικας σε 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]);

A. Θεωρία 2. Ταξινόµηση µε Εισαγωγή (Insertion Sort) 3. Ένα Παράδειγµα Εκτέλεσης

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 6

9 2 4 7 1 8 6 3 i=0:

1 2 4 7 9 8 6 3 i=1:

1 2 4 7 9 8 6 3 i=2:

1 2 3 7 9 8 6 4 i=3:

1 2 3 4 9 8 6 7 i=4:

1 2 3 4 6 8 9 7 i=5:

1 2 3 4 6 7 9 8 i=6:

1 2 3 4 6 7 8 9 i=7:

Αρχικός Πίνακας: 9 2 4 7 1 8 6 3

Τελικός Πίνακας: 1 2 3 4 6 7 8 9

A. Θεωρία 2. Ταξινόµηση µε Επιλογή (Selection Sort) 4. Άσκηση

7 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα

Αφού µελετήσετε το πρόγραµµα selection_sort.c κατασκευάσετε συνάρτηση που παίρνει ως όρισµα

έναν πίνακα ακεραίων (και τη διάστασή του) και τον ταξινοµεί µε χρήση της selection sort.

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

Ακολουθεί ο κώδικας σε 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;

A. Θεωρία 3. Ταξινόµηση µε Εισαγωγή (Insertion Sort) 3. Ένα Παράδειγµα Εκτέλεσης

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 10

9 2 4 7 1 8 6 3 i=1:

2 9 4 7 1 8 6 3 i=2:

2 4 9 7 1 8 6 3 i=3:

2 4 7 9 1 8 6 3 i=4:

1 2 4 7 9 8 6 3 i=5:

1 2 4 7 8 9 6 3 i=6:

1 2 4 6 7 8 9 3 i=7:

Αρχικός Πίνακας: 9 2 4 7 1 8 6 3

Τελικός Πίνακας: 1 2 3 4 6 7 8 9

A. Θεωρία 3. Ταξινόµηση µε Εισαγωγή (Insertion Sort) 4. Άσκηση

11 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα

Αφού µελετήσετε το πρόγραµµα insertion_sort.c κατασκευάσετε συνάρτηση που παίρνει ως όρισµα

έναν πίνακα ακεραίων (και τη διάστασή του) και τον ταξινοµεί µε χρήση της insertion sort.

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]

Ακολουθεί ο κώδικας σε 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]);

A. Θεωρία 4. Ταξινόµηση Φυσαλίδας(Bubble Sort) 3. Ένα Παράδειγµα Εκτέλεσης

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 14

9 2 4 7 1 8 6 3 i=0:

1 9 2 4 7 3 8 6 i=1:

1 2 9 3 4 7 6 8 i=2:

1 2 3 9 4 6 7 8 i=3:

1 2 3 4 9 6 7 8 i=4:

1 2 3 4 6 9 7 8 i=5:

1 2 3 4 6 7 9 8 i=6:

1 2 3 4 6 7 8 9 i=7:

Αρχικός Πίνακας: 9 2 4 7 1 8 6 3

Τελικός Πίνακας: 1 2 3 4 6 7 8 9

A. Θεωρία 4. Ταξινόµηση Φυσαλίδας(Bubble Sort) 4. Άσκηση

15 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα

Αφού µελετήσετε το πρόγραµµα bubble_sort.c κατασκευάσετε συνάρτηση που παίρνει ως όρισµα

έναν πίνακα ακεραίων (και τη διάστασή του) και τον ταξινοµεί µε χρήση της bubble sort.

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

Το σώµα του αλγορίθµου φαίνεται στον ακόλουθο κώδικα (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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα

Η διαδικασία merge δουλεύει ως εξής:

Σαρώνει τους δύο πίνακες ταυτόχρονα από αριστερά προς τα δεξιά.

Συγκρίνει τα δύο τρέχοντα στοιχεία των πινάκων

Επιλέγει το µικρότερο και το βάζει στην επόµενη θέση της ταξινοµηµένης ακολουθίας

Όταν εξαντληθούν τα στοιχεία του ένος από τους δύο πίνακες, βάζουµε όσα στοιχεία απέµειναν

από τον άλλο πίνακα στο τέλος της ταξινοµηµένης ακολουθίας.

Στο παράδειγµα βλέπουµε µερικά βήµατα και τους µετρητές που χρησιµοποιούνται.

A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 4. Η διαδικασία merge

33 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα

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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα

Άσκηση: Μελετήστε το πρόγραµµα mergesort.c και “καθαρίστε” το από τις εκτυπώσεις ώστε η

mergesort να είναι µια αυτόνοµη συνάρτηση.

A. Θεωρία 5. Ταξινόµηση µε Συγχώνευση (Merge Sort) 5. Άσκηση

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

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);

Γρήγορη Ταξινόµηση 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 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα

Η διαµέριση των στοιχείων στα µικρότερα και µεγαλύτερα ή ίσα µπορεί να γίνει µε πολλούς

τρόπους:

Π.χ. ένας απλός τρόπος είναι να χρησιµοποιήσουµε έναν βοηθητικό πίνακα που να

βάζουµε στα αριστερά τα µικρότερα στοιχεία και στα δεξιά τα µεγαλύτερα στοιχεία του

οδηγού.

Ωστόσο εµείς θα µελετήσουµε έναν τρόπο διαµέρισης, που είναι µια µικρή παραλλαγή του

σχήµατος Hoare:

Σαρώνουµε τον πίνακα από αριστερά ψάχνοντας για ένα στοιχείο που είναι µεγαλύτερο

του οδηγού

Σαρώνουµε τον πίνακα από δεξιά ψάχνοντας για ένα στοιχείο που είναι µικρότερο (ή ίσο)

του οδηγού

Ανταλλάσσουµε τα δύο στοιχεία και επαναλαµβάνουµε µέχρι να γίνει ο χωρισµός των

στοιχείων.

Μελετούµε το παράδειγµα της επόµενης διαφάνειας

A. Θεωρία 6. Γρήγορη Ταξινόµηση (Quick Sort) 4. Η διαδικασία partition

Παράδειγµα εκτέλεσης της 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 19 i=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=7 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

6 8 4 1 2 9 20 11 22 19

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;

A. Θεωρία 6. Γρήγορη Ταξινόµηση (Quick Sort) 5. Άσκηση

45 ∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα

Άσκηση: Μελετήστε το πρόγραµµα quicksort.c και “καθαρίστε” το από τις εκτυπώσεις ώστε η

quicksort να είναι µια αυτόνοµη συνάρτηση.

Β. Ασκήσεις Εφαρµογή 1: Ταξινόµηση Πραγµατικών Αριθµών

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 46

Μετατρέψτε την bubble sort και την quick sort έτσι ώστε να πραγµατοποιούν ταξινόµηση σε

τύπο δεδοµένων double.

Β. Ασκήσεις Εφαρµογή 2: Ταξινόµηση σε Φθίνουσα Σειρά

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 47

Μετατρέψτε την insertion sort και την merge sort έτσι ώστε να πραγµατοποιούν ταξινόµηση σε

φθίνουσα σειρά.

Β. Ασκήσεις Εφαρµογή 3: Quick Sort που χρησιµοποιεί Insertion Sort

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 48

Προτείνεται η εξής υβριδική µέθοδος ταξινόµησης:

Εκτελούµε τον αλγόριθµο Quick Sort

Αν ωστόσο ο πίνακας έχει το πολύ 5 στοιχεία, τότε αυτός ταξινοµείται µε χρήση της

insertion sort

Κατασκευάστε την νέα µέθοδο ταξινόµησης µε όνοµα hybrid sort και αναδείξτε τη χρήση της µε

µία κατάλληλη συνάρτηση main.

Β. Ασκήσεις Εφαρµογή 4.1: Εκτέλεση όλων των αλγορίθµων

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 49

∆ηµιουργήστε ένα πρόγραµµα το οποίο:

∆ηµιουργείται ένας πίνακας 100 ακεραίων αριθµών. Οι τιµές του πίνακα να είναι ακέραιοι

στο εύρος [0U1000]

Καλούνται διαδοχικά οι 5 αλγόριθµοι ταξινόµησης που µελετήσαµε και προβάλλεται το

αποτέλεσµα της ταξινόµησης του πίνακα.

Β. Ασκήσεις Εφαρµογή 4.2: Πλήθος Συγκρίσεων των Αλγορίθµων Αναζήτησης

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 50

Τροποποιήστε τους 3 µη αναδροµικούς αλγορίθµους, ώστε να µετράνε το πλήθος των

συγκρίσεων που πραγµατοποιούνται.

Μετά την εκτέλεση του αντίστοιχου αλγορίθµου να τυπώνεται το πλήθος των συγκρίσεων που

πραγµατοποιήθηκαν.

Σηµείωση: Όταν λέµε συγκρίσεις εννοούµε τις συγκρίσεις που γίνονται µεταξύ στοιχείων

του πίνακα.

Β. Ασκήσεις Εφαρµογή 4.3: Πλήθος Συγκρίσεων των Αλγορίθµων Αναζήτησης

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 51

Τροποποιήστε τους 2 αναδροµικούς αλγορίθµους, ώστε να µετράνε το πλήθος των συγκρίσεων

που πραγµατοποιούνται.

Μετά την εκτέλεση του αντίστοιχου αλγορίθµου να τυπώνεται το πλήθος των συγκρίσεων που

πραγµατοποιήθηκαν.

Σηµείωση: Όταν λέµε συγκρίσεις εννοούµε τις συγκρίσεις που γίνονται µεταξύ στοιχείων

του πίνακα.

Β. Ασκήσεις Εφαρµογή 4.4: Πειραµατική Μελέτη των Αλγορίθµων Αναζήτησης

∆ηµήτρης Ψούνης, Αλγόριθµοι σε C, Μάθηµα 3: Ταξινόµηση Πίνακα 52

Πειραµατιστείτε δοκιµάζοντας διαφορετικές διαστάσεις στον πίνακα.

Ποιος αλγόριθµος δείχνει να επικρατεί των άλλων;