Αυτά είναι παραδείγματα αλγορίθμων για την ταξινόμηση μιας στοίβας καρτών με πολλούς διαφορετικούς αριθμούς, έτσι ώστε οι αριθμοί να είναι σε σειρά.
Οι παίκτες ξεκινούν με μια στοίβα από κάρτες που δεν έχουν ταξινομηθεί.
Πρώτος αλγόριθμος
Αυτός ο αλγόριθμος περνάει από τη στοίβα των καρτών, μία κάρτα τη φορά. Αυτή η κάρτα συγκρίνεται με την επόμενη κάρτα στη στοίβα. Σημειώστε ότι αυτή η θέση αλλάζει μόνο στο βήμα 6. Αυτός ο αλγόριθμος ονομάζεται ταξινόμηση φυσαλίδων. Είναι αργός.
- Εάν η στοίβα των καρτών είναι άδεια ή περιέχει μόνο μία κάρτα, η στοίβα είναι ταξινομημένη- τελειώσατε.
- Πάρτε τη στοίβα των καρτών. Κοιτάξτε το πρώτο φύλλο (το κορυφαίο) της στοίβας.
- Το φύλλο που βλέπετε είναι το φύλλο Α. Η θέση στην οποία βρίσκεται το φύλλο Α αυτή τη στιγμή είναι στη στοίβα P.
- Εάν δεν υπάρχουν άλλα φύλλα στη στοίβα μετά το φύλλο Α, πηγαίνετε στο βήμα 8.
- Η επόμενη κάρτα στη στοίβα είναι η κάρτα Β.
- Αν η κάρτα Β έχει μικρότερο αριθμό από την κάρτα Α, ανταλλάξτε τις θέσεις των καρτών Α και Β. Θυμηθείτε ότι το κάνατε αυτό. Όταν ανταλλάσσετε τις κάρτες, μην αλλάζετε τη θέση P.
- Αν υπάρχει άλλο φύλλο στη στοίβα μετά τη θέση P, κοιτάξτε το.Επιστρέψτε στο βήμα 3.
- Εάν δεν αλλάξατε τη θέση κανενός φύλλου στην τελευταία εκτέλεση, τελειώσατε- η στοίβα των φύλλων είναι ταξινομημένη.
- Διαφορετικά επιστρέψτε στο βήμα 2.
Παράδειγμα βήμα προς βήμα
Ας πάρουμε μια στοίβα από κάρτες με τους αριθμούς "5 1 4 2 8" και ας την ταξινομήσουμε από τον μικρότερο αριθμό στον μεγαλύτερο χρησιμοποιώντας αυτόν τον αλγόριθμο. Σε κάθε βήμα, ο αλγόριθμος συγκρίνει τα στοιχεία που είναι γραμμένα με έντονα γράμματα. Η κορυφή της στοίβας των καρτών βρίσκεται στην αριστερή πλευρά.
Πρώτο πέρασμα:
( 5 1 4 2 8 ) → {\displaystyle \to }
( 1 5 4 2 8 ) Εδώ, ο αλγόριθμος συγκρίνει τα δύο πρώτα στοιχεία και τα ανταλλάσσει.
( 1 5 4 2 8 ) → {\displaystyle \to }
( 1 4 5 2 8 )
( 1 4 5 2 8 ) → {\displaystyle \to }
( 1 4 2 5 8 )
( 1 4 2 5 8 ) → {\displaystyle \to }
( 1 4 2 5 8 ) Τα στοιχεία αυτά είναι ήδη στη σειρά, οπότε ο αλγόριθμος δεν τα ανταλλάσσει.
Δεύτερο πέρασμα:
( 1 4 2 5 8 ) → {\displaystyle \to }
( 1 4 2 5 8 )
( 1 4 2 5 8 ) → {\displaystyle \to }
( 1 2 4 5 8 )
( 1 2 4 5 8 ) → {\displaystyle \to }
( 1 2 4 5 8 )
( 1 2 4 5 8 ) → {\displaystyle \to }
( 1 2 4 5 8 )
Τώρα, η στοίβα των καρτών είναι ήδη ταξινομημένη, αλλά ο αλγόριθμός μας δεν το γνωρίζει αυτό. Ο αλγόριθμος χρειάζεται ένα ολόκληρο πέρασμα χωρίς καμία ανταλλαγή για να γνωρίζει ότι είναι ταξινομημένη.
Τρίτο πέρασμα:
( 1 2 4 5 8 ) → {\displaystyle \to }
( 1 2 4 5 8 )
( 1 2 4 5 8 ) → {\displaystyle \to }
( 1 2 4 5 8 )
( 1 2 4 5 8 ) → {\displaystyle \to }
( 1 2 4 5 8 )
( 1 2 4 5 8 ) → {\displaystyle \to }
( 1 2 4 5 8 )
Τέλος, ο πίνακας ταξινομείται και ο αλγόριθμος μπορεί να σταματήσει.
Ιστορία
Πρόκειται για έναν εύκολο στην κατανόηση αλγόριθμο ταξινόμησης. Οι επιστήμονες πληροφορικής τον ονόμασαν ταξινόμηση φυσαλίδων, επειδή τα μικρότερα στοιχεία θα ανεβαίνουν στην κορυφή, αλλάζοντας τη θέση τους σε κάθε εκτέλεση. Δυστυχώς, ο αλγόριθμος δεν είναι πολύ καλός, επειδή χρειάζεται πολύς χρόνος (πολλά περάσματα μέσα από τη στοίβα των καρτών) για την ταξινόμηση.
Δεύτερος αλγόριθμος
Αυτός ο αλγόριθμος χρησιμοποιεί μια άλλη ιδέα. Μερικές φορές η επίλυση ενός προβλήματος είναι δύσκολη, αλλά το πρόβλημα μπορεί να αλλάξει έτσι ώστε να αποτελείται από απλούστερα προβλήματα που επιλύονται ευκολότερα. Αυτό ονομάζεται αναδρομή. Είναι πιο δύσκολο να κατανοηθεί από το πρώτο παράδειγμα, αλλά θα δώσει έναν καλύτερο αλγόριθμο.
Βασική ιδέα
- Αν η στοίβα δεν έχει καθόλου κάρτες ή έχει μόνο μία κάρτα, τότε είναι ταξινομημένη και τελειώσατε.
- Χωρίστε τη στοίβα των καρτών σε δύο μισά, περίπου ίδιου μεγέθους. Αν υπάρχει περιττός αριθμός καρτών, η μία από τις δύο στοίβες θα έχει μία κάρτα περισσότερη από την άλλη.
- Ταξινομήστε καθεμία από τις δύο στοίβες χρησιμοποιώντας τον αλγόριθμο (Για κάθε στοίβα, ξεκινήστε από το στοιχείο 1 αυτής της λίστας).
- Συγχωνεύστε τις δύο ταξινομημένες στοίβες, όπως περιγράφεται παρακάτω.
- Το αποτέλεσμα είναι μια ταξινομημένη στοίβα από κάρτες. Τελειώσατε.
Συγχώνευση δύο στοίβες μαζί
Αυτό λειτουργεί με δύο στοίβες καρτών. Η μία από αυτές ονομάζεται Α, η άλλη ονομάζεται Β. Υπάρχει μια τρίτη στοίβα που είναι κενή στην αρχή, η οποία ονομάζεται Γ. Στο τέλος, θα περιέχει το αποτέλεσμα.
- Αν είτε η στοίβα Α είτε η στοίβα Β είναι άδεια, βάλτε όλες τις κάρτες της στοίβας που δεν είναι άδεια στην κορυφή της στοίβας Γ.Τελειώσατε, η στοίβα Γ είναι το αποτέλεσμα της συγχώνευσης. (Σημείωση: πάρτε ολόκληρη τη στοίβα και βάλτε την πάνω στη στοίβα Γ- αν το κάνετε κάρτα προς κάρτα, θα αλλάξει η σειρά και δεν θα λειτουργήσει όπως θα έπρεπε).
- Κοιτάξτε τις πάνω κάρτες της στοίβας Α και της στοίβας Β. Βάλτε αυτή με τον μικρότερο αριθμό πάνω στη στοίβα Γ. Αν η στοίβα Γ δεν είχε καθόλου κάρτες, τώρα θα έχει μία κάρτα.
- Εάν είτε η στοίβα Α είτε η στοίβα Β έχει κάρτες, επιστρέψτε στο βήμα 1 για να τις ταξινομήσετε.
Ιστορία
Ο John von Neumann ανέπτυξε αυτόν τον αλγόριθμο το 1945. Δεν τον ονόμασε Ταξινόμηση με αριθμούς, τον ονόμασε Mergesort. Είναι ένας πολύ καλός αλγόριθμος ταξινόμησης, σε σύγκριση με άλλους.
Τρίτος αλγόριθμος
Ο πρώτος αλγόριθμος χρειάζεται πολύ περισσότερο χρόνο για να ταξινομήσει τις κάρτες από τον δεύτερο, αλλά μπορεί να βελτιωθεί (να γίνει καλύτερος). Κοιτάζοντας την ταξινόμηση φυσαλίδων, μπορεί να παρατηρηθεί ότι οι κάρτες με υψηλούς αριθμούς μετακινούνται από την κορυφή της στοίβας αρκετά γρήγορα, αλλά οι κάρτες με χαμηλούς αριθμούς στο κάτω μέρος της στοίβας χρειάζονται πολύ χρόνο για να ανέβουν (να μετακινηθούν στην κορυφή). Για να βελτιώσετε τον πρώτο αλγόριθμο, η ιδέα είναι η εξής:
Αντί να συγκρίνετε δύο κάρτες που βρίσκονται η μία δίπλα στην άλλη, στην αρχή διαλέγετε μια "ειδική" κάρτα. Όλες οι άλλες κάρτες συγκρίνονται στη συνέχεια με αυτή την κάρτα.
- Ξεκινάμε με μια στοίβα Α. Θα υπάρχουν άλλες δύο στοίβες Β και Γ, οι οποίες θα δημιουργηθούν αργότερα.
- Εάν η στοίβα Α δεν έχει καθόλου κάρτες ή έχει μόνο μία κάρτα, η ταξινόμηση έχει ολοκληρωθεί.
- Μια κάρτα επιλέγεται από τη στοίβα Α, αν είναι δυνατόν τυχαία. Αυτό ονομάζεται pivot.
- Όλα τα υπόλοιπα φύλλα της στοίβας Α συγκρίνονται με αυτό το σημείο περιστροφής. Οι κάρτες με μικρότερο αριθμό πηγαίνουν στη στοίβα Β, εκείνες με ίσο ή μεγαλύτερο αριθμό πηγαίνουν στη στοίβα Γ.
- Εάν υπάρχουν κάρτες στις στοίβες Β ή Γ, οι στοίβες αυτές πρέπει να ταξινομηθούν με τον ίδιο αλγόριθμο (Ξεκινήστε από τη θέση 1 αυτής της λίστας και για τις δύο στοίβες Β και Γ με τη σειρά).
- Έγινε. Η ταξινομημένη στοίβα καρτών έχει πρώτα την ταξινομημένη στοίβα Β, μετά τον άξονα και μετά την ταξινομημένη στοίβα Γ.
Ιστορία
Ο αλγόριθμος αυτός αναπτύχθηκε από τον C. A. R. Hoare το 1960. Είναι ένας από τους πιο διαδεδομένους αλγορίθμους ταξινόμησης σήμερα. Ονομάζεται Quicksort.