ΤΑΞΙΝΟΜΗΣΗ- ΑΣΚΗΣΕΙΣ Οι μέθοδοι ταξινόμησης INSERTION, SELECTION και BUBBLE SORT με την ολοκλήρωσή τους θα έχουν σε κάθε θέση του πίνακα το σωστό στοιχείο x (ταξινόμηση με αύξουσα σειρά δηλ. στην θέση 0 του πίνακα το μικρότερο στοιχείο, στην 1 η το αμέσως επόμενο ) Έστω ένας πίνακας n=7 θέσεων µη ταξινοµηµένος int Α[] = {; { 4, 9, 10, 12, 15, 16, 22 Ταξινοµηµένος 1. Insertion sort - ταξινόµηση µε εισαγωγή Ενώ αρχικά Α[0]=4, Α[1]=16, Α[2]=22 µε το πέρας της ταξινόµησης θα έχω Α[0]=4, Α[1]=9, Α[2]=10 Η µέθοδος διατρέχει τον πίνακα, παίρνει κάθε στοιχείο x του πίνακα και θεωρώντας τον πίνακα ταξινοµηµένο µέχρι αριστερά του x, το τοποθετεί «σωστά», σπρώχνοντας τα µεγαλύτερα του δεξιά { 4, 16,22, 12, 9, 15, 10 Ετσι π.χ. αν το x=12, αριστερά από το x ο πίνακας θεωρείται ταξινοµηµένος (4, 16,22) και πρέπει εκεί να εισαχθεί «σωστά» το x σπρώχνοντας τα µεγαλύτερα 16,22 δεξιά Συνεχίζει µε x=9 κτλ. Ξεκινώντας µε A[1]=16, (ξεκινά θεωρώντας το Α[0] στην σωστή θέση 1 ) έχουµε τα εξής περάσµατα: 4 16 22 12 9 15 10 i=1 4 16 22 12 9 15 10 i=2 4 16 22 12 9 15 10 i=3 4 12 16 22 9 15 10 i=4 4 9 12 16 22 15 10 i=5 4 9 12 15 16 22 10 Ι=6 4 9 10 12 15 16 22 Tαξινοµήστε σε αύξουσα σειρά τον πίνακα µε τις µεθόδους: ταξινόµηση µε εισαγωγή (insertion sort), ταξινόµηση µε επιλογή (selection sort), bubble sort, ταξινόµηση µε συγχώνευση (merge sort) εµφανίζοντας τους αριθµούς µετά από κάθε πέρασµα χωρίς κώδικα. { 4, 12, 16, 22, 9, 15,16, 22 Προγραµµατιστικά χρειαζόµαστε 2 loop, ένα για το δείκτη i του x, από το 1 έως το 6 (length-1) που διατρέχει τον πίνακα ώστε να συµπεριλάβει όλα τα στοιχεία x for (int i=1; i < A.length; i++) ένα για το δείκτη j από το i έως τo 0, που διατρέχει αριστερά το πίνακα ώστε να τοποθετήσει αριστερά «σωστά» το στοιχείο x j=i; while ( j>0 ) j--; 1 Aν ο πίνακας έχει µόνο ένα στοιχείο δεν χρειάζεται sorting. [1]
Ολες οι µέθοδοι ταξινόµησης δέχονται σαν όρισµα τον πίνακα, τον ταξινοµούν και δεν επιστρέφουν τίποτα. i 1 2 3 4 5 6 1. Insertion sort - ταξινόµηση µε εισαγωγή 2 j Ξεκινώ µε x Α[1]=16 και j=1 public static void InsertSort (int[] A) { int x; int j; for (int i=1; i < A.length; i++) { public static void showpinaka(int A[]){ for (int i=0 ; i<a.length; i++) System.out.print( "A("+i+")="+A[i]+" " ); System.out.println(); int numbers[] = {4,16,22,12,9,15,10; showpinaka(numbers) ; sort.insertsort(numbers); showpinaka(numbers) ; // Main.java //i=1,2,3,4,5,6 x = A[i]; j=i; // σπρώχνω τα µεγαλύτερα δεξιά while (j>0 && A[j-1] >x ) { //j=i,i-1,i-2, A[j] = A[j-1]; j--; A[j]=x; // Sort.java Αρχικά θεωρώ ότι το 1 ο στοιχείο A[0]=4 βρίσκεται στη σωστή θέση. i =1, ξεκινώ µε το 2 ο στοιχείο x=16 A[1]=16 ελέγχω τη θέση του (σωστή αριστερά) δείκτης j=1 Ελέγχω αν 4>16 δηλ. και j>0 αν το προηγούµενο από το x στοιχείο είναι µεγαλύτερο του, που δεν ΕΙΝΑΙ, δηλ. είµαι ΟΚ ταξινοµηµένο αριστερά, δεν µπαίνει στο while, Α[1]=16 ----------------------------------------------------- 2 η προσπάθεια i=2, συνεχίζω µε το 3 ο στοιχείο x=22 A[2]=22 ελέγχω τη θέση του (σωστή αριστερά) δείκτης j=2 Ελέγχω αν 16>22 που δεν ΕΙΝΑΙ, άρα δεν µπαίνει στο while ) Α[2]=22 ------------------------- 3 η προσπάθεια i=3, τώρα x=12 μιας και A[3]=12 δείκτης j=3 Ελέγχω αν 22>12 που ΕΙΝΑΙ και µπαίνει στο while για να σπρώξει τα µεγαλύτερα του 12 δεξιά (αρχικά το 22 µετά το 16) Α[3]=Α[2]=22 4, 16, 22, 22, 9, j-- j=2 και ελέγχω πάλι αν 16>12 και το A[1]=16 ΕΙΝΑΙ µεγαλύτερο από το 12 άρα Α[2]=Α[1]=16 4, 16, 16, 22, 9, j-- j=1 και ελέγχω πάλι αν 4>12 που δεν ΕΙΝΑΙ, άρα βγαίνει από το while Α[1]=12 ---------------------- 4, 12, 16, 22, 9, 15, 10 4 η προσπάθεια 2 Aν ο πίνακας έχει µόνο ένα στοιχείο δεν χρειάζεται sorting. [2]
2. Selection Sort - ταξινόµηση µε επιλογή Η ταξινόµηση µε επιλογή διατρέχει τον πίνακα, παίρνει κάθε στοιχείο x του πίνακα και το τοποθετεί στην σωστή τελική και ταξινοµηµένη του θέση (επιλέγοντας την τιµή η οποία θα πρέπει να πάει σε κάθε θέση επιλέγει την µικρότερη κάθε φορά). Αρχικά βρίσκει το µικρότερο στοιχείο του πίνακα x=4 και το ανταλλάσσει µε την τιµή στην πρώτη θέση του πίνακα (βαζοντάς το x στην θέση 0). Κατόπιν από τα υπόλοιπα στοιχεία ξαναβρίσκει το µικρότερο τους x=9, και το ανταλλάζει µε την δεύτερη θέση του πίνακα δηλ. το βάζει στην θέση 1, ενώ στην θέση που ήταν το x, βάζει το στοιχείο που ήταν στην θέση 1 (swap values) κ.ο.κ. Έχουµε λοιπόν τα εξής περάσµατα: i=0 4 16 22 12 9 15 10 i=1 4 9 22 12 16 15 10 i=2 4 9 10 12 16 15 22 i=3 4 9 10 12 16 15 22 i=4 4 9 10 12 15 16 22 i=5 4 9 10 12 15 16 22 Προγραµµατιστικά χρειαζόµαστε 2 loop, ένα µε δείκτη i που διατρέχει τον πίνακα ώστε να συµπεριλάβει όλα τα στοιχεία x for (int i=1; i < A.length-1; i++) ένα µε δείκτη j που διατρέχει τον πίνακα από το i και µετά ώστε να βρεί από τα υπόλοιπα την µικρότερη τιµή και να κάνει την ανταλλαγή for (int j=i+1; j<a.length; j++) i public static void SelectionSort (int[] A) { int indexmin, min; //i=1,2,3,4,5 for (int i = 0; i < A.length-1; i++) { indexmin=i; for (int j=i+1; j<a.length; j++) if (A[j] < A[indexmin]) indexmin=j; //swap the values min = A[indexmin]; A[indexmin] = A[i]; A[i] = min; // Sort.java int number[] = {4,16,22,12,9,15,10; showpinaka(number) ; sort.selectionsort number); showpinaka(number) ; // Main.java [3] ------------------------ 1 η προσπάθεια i=0 indexmin=0 j=1,2,, 6 Eλέγχω αν A[1]<A[0] δεν είναι για κανένα j min=a[0] ανταλλαγή τιμών Α[0] με A[0]=A[0] A[0]=min ---------------------------- 2 η προσπάθεια i =1 indexmin=1 j=2 6 Α[indexmin] Eλέγχω αν A[2]< A[1] Α[6]< A[1] Είναι για j=4 άρα indexmin=4 min=a[4] ανταλλαγή τιμών Α[1] με Α[4] A[4]=A[1] A[1]=min -------------------------- 3 η προσπάθεια i =2 indexmin=2 4, 9, 22, 12, 16, 15, 10
3. Bubble Sort ταξινόµηση φυσαλίδας Ο αλγόριθµος ταξινόµησης bubble sort συγκρίνει κάθε στοιχείο x στην θέση j µε το επόµενό του στην θέση j+1, ξεκινώντας από την µία άκρη του πίνακα µέχρι την άλλη. Μιά µεταβλητή flag σηµατοδοτεί εάν ο πίνακας είναι ταξινοµηµένος ή όχι, που πριν από κάθε πέρασµα του πίνακα την αρχικοποιούµε σε true. Αν κατά την σύγκριση δύο τιµών χρειαστεί να ανταλλαχθούν τότε αλλάζουµε και την τιµή της µεταβλητής σε false. Αν η µεταβλητή διατηρεί την τιµή true, σηµαίνει ότι δεν έχει γίνει κάποια ανταλλαγή τιµών, εποµένως ο πίνακας είναι ταξινοµηµένος και δεν χρειάζεται να γίνει άλλο «πέρασµα». j 4 16 22 12 9 15 10 i=1 4 16 12 9 15 10 22 i=2 4 12 9 15 10 16 22 i=3 4 9 12 10 15 16 22 i=4 4 9 10 12 15 16 22 i=5 4 9 10 12 15 16 22 Εξασφαλίζεται έτσι ότι µε το 1 ο πέρασµα η µεγαλύτερη τιµή θα προχωρήσει στην τελευταία θέση. Στο 5 ο πέρασµα ο πίνακάς µας ταξινοµείται Γενικά για να ταξινοµηθεί ο πίνακας χρειάζονται Ν-1 «περάσµατα» του πίνακα, όπου Ν το πλήθος των στοιχείων. Προγραµµατιστικά χρειαζόµαστε πάλι 2 loop. Ένα για τα περάσµατα και ένα για τους ελέγχους των διαδοχικών x. public static void BubbleSort (int[] A) { int i, j; int temp; boolean flag; for (i=1; i < A.length; i++) { //Τα περάσµατα flag=true; for (j=0; j < A.length-i; j++) if (A[j] > A[j+1]) { temp=a[j]; A[j]= A[j+1]; A[j+1]=temp; ; if (flag) return; // Sort.java int nums[] = {4,16,22,12,9,15,10; showpinaka(nums) ; sort.bubblesort nums); showpinaka(nums) ; // Main.java Αν η µεταβλητή flag αλλάξει τιµή, σηµαίνει ότι κάποιες τιµές έχουν αλλάξει θέση, εποµένως ο πίνακας δεν είναι ταξινοµηµένος και χρειάζεται να γίνει και άλλο «πέρασµα». [4] 1 η προσπάθεια i=1 ο πέρασμα flag=true j=0,1,,5 j=0 : Eλέγχω αν A[0]>A[1] - δεν είναι j=1 : Eλέγχω αν A[1]>A[2] - δεν είναι j=2 :Eλέγχω αν A[2]>A[3] - Είναι temp=a[2]=22 //swap Α[2],Α[3] A[2]=A[3] A[3]=temp j=3:eλέγχω αν A[3]>A[4] Είναι temp=a[3]=22 //swap Α[3],Α[4] A[3]=A[4] A[4]=temp j=4:eλέγχω αν A[4]>A[5] Είναι temp=a[4]=22 //swap Α[4],Α[5] A[4]=A[5] A[5]=temp j=5:eλέγχω αν A[5]>A[6] ] Είναι temp=a[5]=22 A[5]=A[6] A[6]=temp 4,16, 12,22, 9,15,10 4,16,12, 9,22, 15,10 4,16,12, 9,15,22, 10 //swap Α[4],Α[5] και αφού η flag δεν είναι true προχωρώ στο 2ο πέρασμα με i=2 1 η προ i=1 flag=t
Εφαρµογή για ταξινόµηση φοιτητή µε ΑΜ, Επώνυµο & Έτος Εισαγωγής public class MyUtils { //public static void InsertSort (int[] A) { public static void insertsortam (int[] A) { // //public static void SelectionSort (int[] A) { public static void selectsorteponymo (int[] A){ // //public static void BubbleSort (int[] A) { public static void bubblesortee (int[] A){ // //ΜyUtils.java public class UserInput {// η κλάση που σας δίνεται public static String getstring(){ // public static int getshort() { // //UserInput.java Θα πρέπει να βάλετε τις επιθυµητές παραµέτρους και να συµπληρώσετε/διορθώσετε αναλόγως την µέθοδο. Μην ξεχνάτε ότι στην εφαρµογή σας ο πίνακας δηµιουργείται ΣΤΑ ΙΑΚΑ!! (αυτό σηµαίνει ότι το πραγµατικό µέγεθός του µεταβάλλεται... ) public class foititis { private String name; private String surname; private int am; private int registyear; public foititis(string name, String surname){ //δοµητής public void setarmitroou(short x){ public void setetoseisagwgis(short x){ //..και ότι άλλο χρειάζεται //foititis.java public class TestMyUtils { foititis[] f = new foititis[7]; f[0]=new foititis("vassi","koubi",(short)5,(short)2010); // insertsortam // selectsorteponymo.. // bubblesortee.. // TestMyUtils.java Προσοχή π.χ. θα ταξινοµείται το ΑΜ, αλλά όχι αλλάζοντας τα ΑΜ αλλά τα αντικείµενα ( δηλ. δεν θα πρέπει να δώσετε σε ένα φοιτητή ΑΜ που ανήκει σε κάποιον άλλον) Θα χρειαστείτε και την compareto ( ελέγχει αν 2 Strings είναι lexicographically equal, precedes or follows each other). if (f[i].getsurname().compareto(f[j].getsurname())<0) [5]