Η μέθοδος της ταξινόμησης φυσαλίδων σε μια μονοδιάστατη συστοιχία με. Ταξινόμηση από τη φούσκα (Pascal). Από πού προέρχεται ένα τέτοιο ασυνήθιστο όνομα


Όλοι γνωρίζουν ότι από την τάξη της ανταλλαγής ταξινόμηση της ταχύτερης μεθόδου είναι η λεγόμενη Γρήγορη ταξινόμηση. Οι διατριβές γράφονται γι 'αυτήν, υπάρχουν πολλά άρθρα σχετικά με το habré, βασίζεται σε πολύπλοκους υβριθμικούς αλγόριθμους που βασίζονται σε αυτό. Αλλά σήμερα δεν θα είναι περίπου Γρήγορη ταξινόμηση., αλλά για μια άλλη μέθοδο ανταλλαγής - παλιά καλά διαλογή φυσαλίδων και τις βελτιώσεις, τις τροποποιήσεις, τις μεταλλάξεις και τις ποικιλίες.

Η πρακτική εξάτμιση από αυτές τις μεθόδους δεν είναι AHTI. Τι πολλοί από τις ρουλεμάν κρατούνται όλα αυτά στην πρώτη τάξη. Ως εκ τούτου, το άρθρο απευθύνεται σε όσους ενδιαφέρονται μόνο για τη θεωρία των αλγορίθμων και κάνουν τα πρώτα βήματα προς αυτή την κατεύθυνση.

Εικόνα: φυσαλίδες

Σήμερα θα μιλήσουμε για το απλούστερο Ταξινόμηση ανταλλαγών.

Αν κάποιος ενδιαφέρεται, θα πω ότι υπάρχουν και άλλες τάξεις - Ταξινόμηση της επιλογής, Ταξινόμηση εισόδων, Ταξινόμηση συγχώνευσης, Διανομή διαλογής, Υβριδική ταξινόμηση και Παράλληλη ταξινόμηση. Υπάρχει, παρεμπιπτόντως, ακόμα Εσωτερική διαλογή. Αυτά είναι διάφοροι ψεύτικοι, θεμελιωδώς μη πραγματοποιημένοι, κωμικοί και άλλοι ψευδο-αλγόριθμοι, για τους οποίους θα γράψω μερικά άρθρα σε ένα κόμβο "it-humor".

Αλλά η σημερινή διάλεξη, δεν σχετίζεται, μας ενδιαφέρει τώρα η ανεπιτήδευτη ταξινόμηση με ανταλλαγές. Ταξινόμηση, υπάρχουν επίσης πολλές ανταλλαγές (ξέρω περισσότερα από μια δωδεκάδα), οπότε θεωρούμε το λεγόμενο διαλογή φυσαλίδων Και μερικοί άλλοι, με το στενά αλληλένδετο.

Προειδοποίηση εκ των προτέρων ότι σχεδόν όλες οι παραπάνω μέθοδοι είναι πολύ αργή και η βαθιά ανάλυση της προσωρινής τους πολυπλοκότητας δεν θα είναι. Μερικοί ταχύτεροι, μερικές από τις πιο αξιομνημόνευτες, αλλά, κατά προσέγγιση, μπορούμε να πούμε ότι κατά μέσο όρο Ο.(n 2.). Επίσης, δεν βλέπω τον λόγο να συμπλέξω το άρθρο με εφαρμογές σε οποιεσδήποτε γλώσσες προγραμματισμού. Ενδιαφέρεστε χωρίς την παραμικρή εργασία θα μπορέσει να βρει παραδείγματα κώδικα σε ροζέτα, Wikipedia ή κάπου αλλού.

Αλλά πίσω στην ταξινόμηση των ανταλλαγών. Η ρύθμιση συμβαίνει ως αποτέλεσμα πολλαπλής σταθερής απαρίθμησης του πίνακα και τη σύγκριση των παραμέτρων των στοιχείων μεταξύ τους. Εάν τα συγκριτικά στοιχεία δεν ταξινομούνται μεταξύ τους, τότε τα αλλάζουμε σε μέρη. Το μόνο ερώτημα είναι ακριβώς το τι είναι η παράκαμψη Makar και ποια αρχή για να επιλέξετε ένα ζευγάρι για σύγκριση.

Ας ξεκινήσουμε όχι με τη διαλογή φυσαλίδων αναφοράς, αλλά από τον αλγόριθμο που ονομάζεται ...

Ηλίθια ταξινόμηση

Ταξινόμηση και πραγματικά ηλίθια. Θεωρούμε τη συστοιχία προς τα αριστερά και δεξιά και στο δρόμο συγκρίνοντας τους γείτονες. Αν συναντάμε μερικά αμοιβαία μη διορθωμένα στοιχεία, τα αλλάζουμε σε μέρη και επιστρέφουμε στους κύκλους, τότε εννοείτε στην αρχή. Περνάμε, ελέγξτε τη συστοιχία, αν συναντήσουμε ξανά "λάθος" μερικά γειτονικά στοιχεία, τότε αλλάζουμε σε μέρη και πάλι ξεκινάμε όλους τους Syznov. Συνεχίζουμε μέχρι να ταξινομηθεί αργά ο πίνακας.

"Οποιοσδήποτε ανόητος είναι σε θέση να λύσει" - θα πείτε και θα είστε απολύτως σωστοί. Αυτός είναι ο λόγος για τον οποίο η ταξινόμηση και η ονομασία "ηλίθια". Σε αυτή τη διάλεξη, θα βελτιώσουμε με συνέπεια και θα τροποποιήσουμε αυτή τη μέθοδο. Τώρα έχει προσωρινή πολυπλοκότητα Ο.(n 3.), που παράγει μια διόρθωση, θα το φέρω Ο.(n 2.), τότε θα επιταχύνετε λίγο περισσότερο, τότε ακόμα, και στο τέλος παίρνουμε Ο.(Ν. Κούτσουρο. Ν.) - Και δεν θα είναι "γρήγορο είδος"!

Εισάγουμε μια ενιαία βελτίωση σε ένα ανόητο είδος. Έχοντας βρει τα δύο γειτονικά αχρησιμοποίητα στοιχεία κατά τη διέλευση και την αλλαγή τους σε μέρη, δεν θα γυρίσω πίσω στην αρχή της σειράς και παρακάμπτοντας ήρεμα την παράκαμψη του στο τέλος.

Σε αυτή την περίπτωση, μπροστά μας δεν είναι τίποτα περισσότερο από το διάσημο ...

Διαλογή φυσαλίδων

Ή Ταξινόμηση με απλές ανταλλαγές. Αθάνατο κλασικό είδος. Η αρχή της δράσης είναι απλή: παρακάμπτοντας έναν πίνακα από την αρχή μέχρι το τέλος, περνώντας τα γειτονικά γειτονικά στοιχεία κατά μήκος του δρόμου. Ως αποτέλεσμα του πρώτου περάσματος, το μέγιστο στοιχείο θα "εμφανιστεί". Τώρα πρέπει να πάμε γύρω από το αλατισμένο τμήμα του πίνακα (από το πρώτο στοιχείο του προτελευταίου) και να αλλάξει κατά μήκος της διαδρομής των αλατισμένων γειτόνων. Το δεύτερο μεγαλύτερο στοιχείο θα είναι στην προτελευταία θέση. Συνεχίζοντας με το ίδιο πνεύμα, θα παρακάμψουμε ολόκληρο το μειωμένο μη φυτωμένο τμήμα του πίνακα, φτυαρίζοντας τα μέγιστα μέχρι το τέλος.

Αν όχι μόνο για να βάλετε τα μέγιστα να βάλουν τα μέγιστα, αλλά και στην αρχή να μεταφέρετε το ελάχιστο, τότε έχουμε ...

Ταξινόμηση αναδευτήρα

Αυτή είναι Ταξινόμηση με ανάδευση, αυτή είναι Ταξινόμηση κοκτέιλ. Η διαδικασία αρχίζει όπως στη "φούσκα": συμπιέζουμε το μέγιστο στα αυλάκια. Μετά από αυτό, γυρίζουμε στο 180 0 και πηγαίνουμε προς την αντίθετη κατεύθυνση, ενώ ήδη πληρώνουν στην αρχή όχι το μέγιστο και τουλάχιστον. Έχοντας ταξινομηθεί το πρώτο και τελευταίο στοιχεία στη συστοιχία, κάνουμε ξανά την ALDER. Περπατώντας πίσω αρκετές φορές, ως αποτέλεσμα, ολοκληρώστε τη διαδικασία, που βρίσκεται στη μέση της λίστας.

Η ταξινόμηση του αναδευτήρα λειτουργεί λίγο ταχύτερα από τη φούσκα, καθώς ο μασάζ στις σωστές κατευθύνσεις μεταναστεύει εναλλάξ τα μέγιστα και τα ελάχιστα. Βελτιώσεις, όπως λένε, είναι προφανές.

Όπως μπορείτε να δείτε, αν είναι δημιουργικό, η εκτίναξη των στοιχείων βαρέων (πνευμόνων) στα άκρα του πίνακα είναι ταχύτερη. Ως εκ τούτου, οι τεχνίτες προσέφεραν έναν άλλο μη τυποποιημένο "οδικό χάρτη" \u200b\u200bνα παρακάμψει τον κατάλογο.

Ακόμη και καθαρή ταξινόμηση

Αυτή τη φορά δεν θα αφοπλίσουμε τη συστοιχία πίσω και στροφή και πίσω στην ιδέα της συστηματικής ανίχνευσης πίσω δεξιά, αλλά μόνο ένα ευρύτερο βήμα. Στο πρώτο πέρασμα, τα στοιχεία με ένα περίεργο κλειδί συγκρίνονται με τους γείτονες που αυξάνονται στις ψηφοφορίες (1-th που συγκρίνονται από το 2ο, τότε το 3ο από το 4ο, το 5ο από το 6ο και ούτω καθεξής). Στη συνέχεια, αντίθετα, "τα στοιχεία" διαβάζουν "συγκρίνοντας / αλλάζουν με" περίεργο ". Στη συνέχεια, πάλι "υπάρχει κάτι" κάτι ", και πάλι" ακόμη και-Notch ". Η διαδικασία σταματά όταν, μετά από μια σύμβαση δύο διερχόμενων κατά μήκος του ορεινού τύπου ("Odd-Black" και "Ballotless"), δεν συνέβη μια μόνο ανταλλαγή. Έγινε, ταξινομημένο.

Στη συνήθη "φούσκα" κατά τη διάρκεια κάθε πέρασμα, συμπιέζουμε το τρέχον μέγιστο στο τέλος της συστοιχίας. Εάν μετακινείτε την έκρηξη των ερωτηθέντων και των περίεργων δεικτών, τότε αμέσως όλα τα περισσότερα ή λιγότερο μεγάλα στοιχεία της συστοιχίας ταυτόχρονα σε ένα χιλιόμετρο πιέζονται προς τα δεξιά σε μία θέση. Έτσι αποδεικνύεται ταχύτερα.

Πήραμε το τελευταίο Ζωγραφισμένος* Για Sortannya Bulbashko.** - Sortanna Grebinets***. Αυτή η μέθοδος οργανώνει αρκετά γρήγορα, Ο.(n 2.) - Η χειρότερη πολυπλοκότητα του. Κατά μέσο όρο, έχουμε Ο.(Ν. Κούτσουρο. Ν.), και το καλύτερο, μην πιστεύετε Ο.(Ν.). Δηλαδή, ένας πολύ αξιόπιστος ανταγωνιστής σε κάθε "ταχεία ταξινόμηση" και αυτό, ειδοποίηση, χωρίς τη χρήση της επανάληψης. Ωστόσο, υποσχέθηκα ότι σε ταχύτητες πλεύσης, δεν θα παραμετήσουμε την ταχύτητα πλεύσης, θα είμαι σιωπηλός και θα το μετατρέψω απευθείας στον αλγόριθμο.


Χελώνα για να κατηγορεί

Μικρή προϊστορία. Το 1980, ο Vlodzimezh Doboshevich εξήγησε γιατί φυσαλίδες και τα παράγωγα ταξινόμησης λειτουργούν τόσο αργά. Είναι όλα λόγω των χελωνών. "Χελώνες" - μικρά αντικείμενα που βρίσκονται στο τέλος της λίστας. Όπως ίσως έχετε παρατηρήσει τη διαλογή των φυσαλίδων που επικεντρώθηκε στα "κουνέλια" (δεν είναι συγκεχυμένη με τα "κουνέλια" της Babushkina) - μεγάλες με την έννοια των στοιχείων στην αρχή της λίστας. Είναι πολύ σφιχτά μετακινούνται στο φινίρισμα. Αλλά τα αργά-ικανοποιητικά ερπετά θα σέρνουν απρόθυμα. Προσαρμοσμένη "Tortila" μπορεί να χρησιμοποιηθεί υπολογισμός.

Εικόνα: Χελώνα ενοχής

Ταξινόμηση υπολογισμού

Στη "φούσκα", συγκρίνεται το "Shaker" και "ακόμα-μη ανάγκη", με έναν ορυφία στη συστοιχία, τα παρακείμενα στοιχεία. Η κύρια ιδέα των "υπολογισμών" είναι να πάρει αρχικά μια επαρκώς μεγάλη απόσταση μεταξύ των συμπληρωματικών στοιχείων και καθώς η συστοιχία προκύπτει από τη συστοιχία, εξαρτάται από το ελάχιστο. Έτσι, όπως ήταν, συνδυάζουμε έναν πίνακα, εξομαλύνοντας σταδιακά σε όλο και πιο όμορφα κλώνους.

Το αρχικό χάσμα μεταξύ των συμπυκνωμένων στοιχείων δεν είναι καλύτερο να μην πάρετε κανένα abba, αλλά λαμβάνοντας υπόψη το ειδικό μέγεθος του καλούμενου Μείωση του παράγοντα, η βέλτιστη τιμή του οποίου είναι περίπου 1,247. Πρώτον, η απόσταση μεταξύ των στοιχείων είναι ίση με το μέγεθος της στερεάς συστοιχίας Μείωση του παράγοντα (Το αποτέλεσμα, φυσικά, στρογγυλεύεται στο πλησιέστερο σύνολο). Στη συνέχεια, περνώντας έναν πίνακα με αυτό το βήμα, διαιρούμε το βήμα Μείωση του παράγοντα Και περάσαμε ξανά τη λίστα. Αυτό συνεχίζεται μέχρι οι διαφορές δεικτών να φτάσουν στη μονάδα. Σε αυτή την περίπτωση, ο πίνακας δεν σχετίζεται με μια συμβατική φούσκα.

Ο έμπειρος και θεωρητικός τρόπος είναι η βέλτιστη τιμή. Μείωση του παράγοντα:

Όταν εφευρεθεί αυτή η μέθοδος, λίγοι άνθρωποι έδωσαν προσοχή σε αυτό στη διασταύρωση της δεκαετίας του '70 και της δεκαετίας του '80. Η δεκαετία αργότερα, όταν ο προγραμματισμός έχει πάψει να είναι πολλοί επιστήμονες και μηχανικοί της IBM και έχουν ήδη ανοίξει η βασική φύση, η μέθοδος επαναπροσδιορίστηκε, διερευνήθηκε και διερευνήθηκε το 1991 ο Stephen Lacey και ο Richard Boxing.

Αυτό είναι στην πραγματικότητα, και όλα όσα ήθελα να σας πω για τη διαλογή των φυσαλίδων και τους άλλους σαν αυτό.

- Σημειώσεις

* Ζωγραφισμένο ( uKR.) - Βελτίωση
** Sortvania Bulbashko ( uKR.) - Ταξινόμηση κατά τη φούσκα
*** Sorthanny Grebinzts ( uKR.) - Ταξινόμηση του υπολογισμού


Τοποθετούμε μια σειρά από πάνω προς τα κάτω, από το μηδενικό στοιχείο στο τελευταίο.

Η ιδέα της μεθόδου: Το βήμα ταξινόμησης αποτελείται από το πέρασμα από το κάτω μέρος του πίνακα. Με τον τρόπο που υπάρχουν ζευγάρια γειτονικών στοιχείων. Εάν τα στοιχεία κάποιων ζευγαριών είναι σε λάθος σειρά, τότε τα αλλάζουμε σε μέρη.

Μετά το μηδενικό πέρασμα με συστοιχία "Top" αποδεικνύεται ότι είναι το πιο "φως" στοιχείο - από εδώ μια αναλογία με μια φούσκα. Το ακόλουθο πέρασμα γίνεται στο δεύτερο στοιχείο από πάνω, οπότε το δεύτερο μεγαλύτερο στοιχείο αυξάνεται στη σωστή θέση ...

Κάνουμε τα περάσματα για όλο το μειωμένο χαμηλότερο μέρος του πίνακα μέχρι να παραμείνει μόνο ένα στοιχείο σε αυτό. Σε αυτά τα άκρα διαλογής, καθώς η ακολουθία παραγγέλνεται αύξουσα.

Πρότυπο. Κενό bubbles (t a, μεγάλο μέγεθος) (μακρύ i, j; t x; για (i \u003d 0; i< size; i++) { // i - αριθμός περάσματος για (j \u003d μέγεθος-1, j\u003e i; j--) ( // Εσωτερικός κύκλος διέλευσης εάν (a\u003e a [j]) (x \u003d a; a \u003d a [j]; ένα [j] \u003d x;))))))))))))))))))))))))))))))))))).

Ο μέσος αριθμός συγκρίσεων και ανταλλαγών έχει τετραγωνική τάξη ανάπτυξης: theta (n 2), από εδώ μπορείτε να συμπεράνετε ότι ο αλγόριθμος φυσαλίδων είναι πολύ αργός και είναι αναποτελεσματικός.
Παρ 'όλα αυτά, έχει ένα τεράστιο πλεονέκτημα: είναι απλό και μπορεί να βελτιωθεί με οποιονδήποτε τρόπο. Αυτό που πούμε τώρα.

Πρώτον, εξετάστε την κατάσταση που δεν συνέβη σε κανέναν ανταλλάξτε σε κανένα από τα περάσματα. Τι σημαίνει?

Αυτό σημαίνει ότι όλα τα ζεύγη βρίσκονται στη σωστή σειρά, οπότε ο πίνακας έχει ήδη ταξινομηθεί. Και για να συνεχίσετε τη διαδικασία δεν έχει νόημα (ειδικά αν ο πίνακας ταξινομηθεί από την αρχή!).

Έτσι, η πρώτη βελτίωση του αλγορίθμου είναι να θυμόμαστε εάν σημειώθηκε οποιαδήποτε ανταλλαγή σε αυτό το απόσπασμα. Εάν όχι, ο αλγόριθμος τελειώνει την εργασία.

Η διαδικασία βελτίωσης μπορεί να συνεχιστεί εάν θυμάστε όχι μόνο το γεγονός της ανταλλαγής, αλλά και το δείκτη της τελευταίας ανταλλαγής k. Πράγματι: Όλα τα ζεύγη της συσκευασίας στοιχείων με δείκτες, μικρότερα Κ, βρίσκονται ήδη στην επιθυμητή σειρά. Περαιτέρω περάσματα μπορούν να ολοκληρωθούν στον δείκτη Κ, αντί να μετακομίσουν στην ανώτατη οθόνη οριοθέτησης που εγκατέστησα εκ των προτέρων.

Ποιοτικά, μια άλλη βελτίωση στον αλγόριθμο μπορεί να ληφθεί από την ακόλουθη παρατήρηση. Αν και η φωτεινή φούσκα από το κάτω μέρος θα αυξηθεί σε ένα πέρασμα, οι βαριές φυσαλίδες χαμηλώστε με ελάχιστη ταχύτητα: ένα βήμα για επανάληψη. Έτσι, η συστοιχία 2 3 4 5 6 1 θα ταξινομηθεί σε 1 διέλευση και η ταξινόμηση της αλληλουχίας 6 1 2 3 4 5 θα απαιτήσει 5 περάσματα.

Για να αποφύγετε ένα παρόμοιο αποτέλεσμα, μπορείτε να αλλάξετε την κατεύθυνση του παρακάτω από άλλα περάσματα. Ο αλγόριθμος που προκύπτει μερικές φορές ονομάζεται " Ταξινόμηση του αναδευτήρα".

Πρότυπο. κενό shakersort (t a, μεγάλο μέγεθος) (μακρύ j, k \u003d μέγεθος-1, μακρύ lb \u003d 1, ub \u003d μέγεθος-1; // τα όρια του διακριτικού μέρους του πίνακα T x; κάνω ( // περάσει πίσω Για (j \u003d ub, j\u003e 0; j--) (εάν (a\u003e a [j]) (x \u003d a; a \u003d a [j]; a [j] \u003d x; k \u003d j;)) lb \u003d k + 1; // περάσει από πάνω προς τα κάτω για (j \u003d 1; j<=ub; j++) { if (a > ένα [j]) (x \u003d a; a \u003d a [j]; ένα [j] \u003d x; k \u003d j;)) ub \u003d k-1; ) Ενώ (lb< ub); }

Πώς οι περιγραφόμενες αλλαγές επηρέασαν την αποτελεσματικότητα της μεθόδου; Ο μέσος αριθμός συγκρίσεων, αν και μειώθηκε, αλλά παραμένει ο (Ν2), ενώ ο αριθμός των ανταλλαγών δεν άλλαξε καθόλου με οποιονδήποτε τρόπο. Ο μέσος όρος (είναι ο χειρότερος) Ο αριθμός των λειτουργιών παραμένει τετραγωνικός.

Η πρόσθετη μνήμη δεν απαιτείται προφανώς. Η συμπεριφορά μιας βελτιωμένης (αλλά όχι αρχικής) μεθόδου είναι μάλλον φυσική, σχεδόν ταξινομημένη συστοιχία θα ταξινομηθεί πολύ ταχύτερη τυχαία. Ταξινόμηση κατά τη φούσκα είναι σταθερή, αλλά η ταξινόμηση του αναδευτήρα χάνει αυτή την ποιότητα.

Στην πράξη, η μέθοδος φυσαλίδων, ακόμη και με βελτιώσεις, έργα, δυστυχώς, πολύ αργή. Και ως εκ τούτου - σχεδόν δεν ισχύει.

Λεπτομέρειες Κατηγορία: Ταξινόμηση και αναζήτηση

Ταξινόμηση κατά φούσκα (ταξινόμηση ανταλλαγών) - Εύκολο στην εφαρμογή και αναποτελεσματική διαλογή αλγορίθμου. Η μέθοδος μελετάται από ένα από τα πρώτα σχετικά με την πορεία της θεωρίας των αλγορίθμων, ενώ στην πράξη χρησιμοποιείται πολύ σπάνια.

Ο αλγόριθμος αποτελείται από επαναλαμβανόμενους περάσματα στον ταξινομημένο πίνακα. Για κάθε πέρασμα, τα στοιχεία συγκρίνονται με συνέπεια σε ζεύγη και, εάν η σειρά είναι εσφαλμένη, η ανταλλαγή στοιχείων πληρούται. Ο πίνακας συστοιχιών επαναλαμβάνεται μία φορά ή μέχρι το επόμενο πέρασμα αποδεικνύεται ότι οι ανταλλαγές δεν χρειάζονται πλέον, πράγμα που σημαίνει - ένας πίνακας ταξινομείται. Με κάθε πέρασμα του αλγορίθμου στον εσωτερικό κύκλο, το επόμενο μεγαλύτερο στοιχείο του πίνακα τίθεται στη θέση του στο τέλος του πίνακα δίπλα στο προηγούμενο "μεγαλύτερο στοιχείο" και το μικρότερο στοιχείο μετακινείται σε μία θέση στην αρχή του Η συστοιχία ("εμφανίζεται" στην επιθυμητή θέση ως φούσκα στο νερό, επομένως και το όνομα του αλγορίθμου).

Χειρότερος χρόνος
Η καλύτερη στιγμή
Μέσος χρόνος
Κόστος μνήμης

Ένα παράδειγμα του έργου του αλγορίθμου

Πάρτε έναν πίνακα με αριθμούς "5 1 4 2 8" και να ταξινομήσετε τις τιμές ανερχόμενες, χρησιμοποιώντας τη διαλογή με μια φούσκα. Αυτά τα στοιχεία που συγκρίνονται σε αυτό το στάδιο επισημαίνονται.

Πρώτο πέρασμα:

(5 1 4 2 8) (1 5 4 2 8), εδώ ο αλγόριθμος συγκρίνει τα δύο πρώτα στοιχεία και τις αλλάζει σε μέρη. (1 5 4 2 8) (1 4 5 2 8), αλλαγές στους χώρους, επειδή (1 4 5 2 8) (1 4 2 5 8), αλλαγές στους χώρους, επειδή (1 4 2 5 8 ) (1 4 2 5 8 ), Τώρα, λόγω του γεγονότος ότι τα στοιχεία είναι στα μέρη τους (), ο αλγόριθμος δεν τις αλλάζει σε μέρη.

Δεύτερο πέρασμα:

(1 4 2 5 8) (1 4 2 5 8) (1 4 2 5 8) (1 2 4 5 8), αλλαγές στους χώρους, επειδή (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8 ) (1 2 4 5 8 )

Τώρα ο πίνακας είναι πλήρως ταξινομημένος, αλλά ο αλγόριθμος δεν ξέρει αν είναι. Ως εκ τούτου, πρέπει να κάνει ένα πλήρες πέρασμα και να καθορίσει ότι δεν υπήρχε μετάθεση των στοιχείων.

Τρίτο πέρασμα:

(1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8) (1 2 4 5 8 ) (1 2 4 5 8 )

Τώρα ο πίνακας ταξινομείται και ο αλγόριθμος μπορεί να ολοκληρωθεί.

Εφαρμογή του αλγορίθμου σε διάφορες γλώσσες προγραμματισμού:

Σύνταξη Intel

Mov BX, Offset Array Mov CX, N For_i: Dec CX XOR DX, DX FOR_J: CMP DX, CX JAE EXIT_FOR_J JBE NO_SWAP MOV AH, BYTE PTR BX MOV BYTE PTR BX, AH NO_SWAP: Inc DX JMP For_j exit_for_j: βρόχος for_i

AT & T Σύνταξη (GNU)

Κείμενο # Void Bubble_sort (μη υπογεγραμμένη * συστοιχία, μη υπογεγραμμένο μεγάλο); .Globl bubble_sort .type bubble_sort, @function bubble_sort: mov 8 (% ESC),% ECX # μη υπογεγραμμένο μήκος CMP $ 1,% ECX JBE EXIT MOV 4 (% ESP),% EAX # Unsigned * Array Dec% ECX fore_ecx: Xor % EDI,% EDI FOR_EDI: MOV (% EAX,% EDI, 4),% EBX CMP% EBX, 4 (% EAX,% EDI, 4) JAE NO_XCHNG MOV 4 (% EAX,% EDI, 4),% EDX MOV% EDX, (% EYX,% EDI, 4) MOV% EBX, 4 (% EYX,% EDI, 4) NO_XCHNG: INC% EDI CMP% EDI,% ECX JNE FOR_EDI LOOP FOR_ECX EXIT: RET

ΝΤΟ.

#Define swap (a, b) (int t \u003d a; a \u003d b; b \u003d t;) void bubbles (int * a, int n) (int i, j; για (i \u003d n - 1; i\u003e 0 · i--) (για (j \u003d 0; j< i; j++) { if (a[j] > α) ανταλλαγή (ένα [j], α) · )))

C ++.

Χρησιμοποιώντας πρότυπο.

#Περιλαμβάνω. Πρότυπο.< typename Iterator > Void Bubble_sort (πρώτος εξοπλισμός, ο iterator τελευταία) (ενώ< --Last) for(Iterator i = First; i < Last; ++i) if (*(i + 1) < *i) std::iter_swap(i, i + 1); }

Χωρίς πρότυπο χρήσης

Κενή φούσκα (int * a, int n) (για (int i \u003d n - 1, i\u003e \u003d 0; i-) (για (int j \u003d 0; j< i; j++) { if (a[j] > α) (int tmp \u003d a [j]; a [j] \u003d a; a \u003d tmp;))))

C #

Κενό bubbles (int a) (για (int i \u003d 0, i< A.Length; i++) { for (int j = i+1; j < A.Length; j++) { if (A[j] < A[i]) { var temp = A[i]; A[i] = A[j]; A[j] = temp; } } } }

Δελφοί.

Ταξινόμηση ενός μονοδιάστατου δυναμικού ακέραιου μοσχάρι:

Πληκτρολογήστε Tintvec \u003d πίνακα ακέραιου. ... Διαδικασία Bubblesort (var a: tintvec); Var i, p, n: ακέραιο? Β: Boolean. Ξεκινήστε n: \u003d μήκος (α); Αν Ν.< 2 then exit; repeat b:= false; Dec(n); if n > 0 Στη συνέχεια, για i: \u003d 0 έως το N-1 κάνετε εάν ένα [i]\u003e a τότε ξεκινά p: \u003d a [i]; Ένα [i]: \u003d a; Α: \u003d P; Β: \u003d TRUE; τέλος; Μέχρι να μην β? τέλος;

ΡΕ.

Void Bubbles (Alias \u200b\u200bop, T) (Tmps) (ITAEACH (I, Ref a; Itarray) (IF (Ref B, Itarray) (αν (Mixin (OP)) (Auto TMP \u003d a; a \u003d b; B \u003d tmp;))))

Εμποδίζω

Κάνετε i \u003d n-1,1, -1 do j \u003d 1, i εάν (a (j) .gt.a (j + 1)) τότε t \u003d a (j) a (j) \u003d a (j + 1 ) A (j + 1) \u003d t endif enddo enddo

Ιάβα.

Κενό bubbles (int arr) (για (int i \u003d 0, i< arr.length-1; i++){ for (int j = i+1; j < arr.length; j++){ if (arr[i] < arr[j]) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; } } } }

Pascal

Για i: \u003d n-1 downto 1 do (n - μέγεθος συστοιχιών m) για j: \u003d 1 να κάνω εάν m [j]\u003e m τότε ξεκινά tmp: \u003d m [j]; M [j]: \u003d m; M: \u003d tmp; τέλος; Γράψτε ("η έξοδος των τιμών m:"); Για i: \u003d 1 έως n γράψτε (m [i]: 4); Writeln;

Βελτιωμένος αλγόριθμος ταξινόμησης από τη φούσκα:

P: \u003d TRUE; (Υπάρχει μια μεταβολή;) Κ: \u003d 1; (Προβολή αριθμού) ενώ το P κάνει αρχίσει p: \u003d false; Για i: \u003d 1 έως n - k κάνετε εάν x [i]\u003e x τότε ξεκινήστε ένα: \u003d x [i]; X [i]: \u003d x; X: \u003d a; P: \u003d TRUE; Τέλος; Κ: \u003d K + 1; Τέλος;

Πίδακας

Για (@out) (για (0 .. $ n-1) (αν ($ out [$ _] gt $ out [$ _ + 1]) (($ out [$ _], $ OUT [$ _ + 1]) \u003d ($ out [$ _ + 1], $ out [$ _]);)))))

Ρουμπίνι

Arr \u003d swap \u003d true μέγεθος \u003d arr.length - 1 ενώ ανταλλάξτε swap \u003d false για i in 0 ... swap swap | \u003d arr [i]\u003e arr [i], arr \u003d arr [i] αν arr [i ]\u003e Arr τελικό μέγεθος - \u003d 1 τέλος βάζει arr.join ("") # εξόδου \u003d\u003e 1 3 3 5 8 10 11 12 17 20 20

Πύθων

Def swap (arr, i, j): arr [i], arr [j] \u003d arr [j], arr [i] def bubble_sort (arr): i \u003d len (arr) ενώ εγώ\u003e 1: για j στο xrange (Ι - 1): Εάν arr [j]\u003e arr: swap (arr, j, j + 1) i - \u003d 1

VBA.

Sub shums (mus () ως μακρύ) dim i ως μακρύ, tmp ως μακρύ, t ως boolean t \u003d true κάνει ενώ tt \u003d false για i \u003d 0 to ubound (mus ()) - 1 αν mus (i)\u003e mus ( I + 1) Τότε tmp \u003d mus (i) mus (i) \u003d mus (i + 1) mus (i + 1) \u003d tmp t \u003d true end αν το επόμενο βρόχο άκρο

Php.

$ Μέγεθος \u003d μέγεθος ($ arr) -1; Για ($ i \u003d $ μέγεθος, $ i\u003e \u003d 0; $ i-) (για ($ j \u003d 0; $ j<=($i-1); $j++) if ($arr[$j]>$ arr [$ j + 1]) ($ k \u003d $ arr [$ j]; $ arr [$ j] \u003d $ arr [$ j + 1]; $ arr [$ j + 1] \u003d $ k;))

JavaScript.

Λειτουργία Sortbubble (δεδομένα) (var tmp; για (var i \u003d data.length - 1; i\u003e 0; i--) (για (var j \u003d 0; j< i; j++) { if (data[j] > Δεδομένα) (tmp \u003d δεδομένα [j] · δεδομένα [j] \u003d δεδομένα · δεδομένα \u003d tmp;))) επιστροφής δεδομένων · )

Javafx

Λειτουργία Bubblesort (SEQ: Αριθμός): Αριθμός (VAR Sort \u003d SEQ, VAR ELEM: Αριθμός; για (n στην αντίστροφη) (αν (i in)< sort[i]){ elem = sort[i]; sort[i] = sort; sort = elem; } } } return sort; }

Νεράιδα

Χρησιμοποιώντας το σύστημα.console; χρησιμοποιώντας nemerle.collections. Def arr \u003d πίνακα; Foreach (i in) foreach (j in) όταν (arr [j]\u003e arr) (arr [j], arr) \u003d (arr, arr [j]); Η λίστας που ταξινομείται (ταξινόμηση $ "είναι ένα $ (Arr.Tolist ())");

TurboBobasic 1.1

CLS τυχαίο timer defint x, y, n, i, j, dn \u003d 10 "32 766 - 62,7 sec dim y [n], y1 [n], y2 [n], y3 [n]" fre (-1) \u003d 21440-21456 Εκτύπωση "zapolnenie massiva enementionami" για το x \u003d 1 έως ny [x] \u003d x Εκτύπωση y [x]; Επόμενο x: Εκτύπωση εκτύπωσης "Peremeshivanije ementialov massiva" Εκτύπωση "SLUCHAINYE Chisla" για x \u003d 1 έως n yd \u003d y [x] x] xs \u003d int (rnd * n) +1 Εκτύπωση XS; Y [x] \u003d y y \u003d yd επόμενη x: εκτύπωση εκτύπωσης "peremeshannyj massiv" για το x \u003d 1 έως n Εκτύπωση y [x]; Επόμενο x: Εκτύπωση "Algoritm" sortirovka prostym obmenom "o (n ^ 2) mtimer για j \u003d 1 έως n-1 βήμα 1 f \u003d 0 για i \u003d 1 έως nj Βήμα 1" αν y [i]\u003e yene d \u003d y [i]: y [i] \u003d y: y \u003d d: f \u003d 1 αν y [i]\u003e yene swap y [i], y: f \u003d 1 Εντοπισμός 8,1 Rempt "anymacija sortirovki rem για x1 \u003d 1 στο N REM Animation Block Print Y; REM NEXT X1: Εκτύπωση REM καθυστέρηση .5 REM Επόμενο i Αν f \u003d 0 τότε έξοδος για το επόμενο J T1 \u003d Mtimer Εκτύπωση "Otsortirovannyj Massiv" για το x \u003d 1 έως n Εκτύπωση y [x]. Επόμενο x: Εκτύπωση εκτύπωσης "που έχει περάσει χρόνο \u003d" t1

Όπως σημειώνεται, ο αλγόριθμος χρησιμοποιείται σπάνια στην πράξη, καθώς έχει χαμηλή απόδοση. Στην καλύτερη περίπτωση, η ταξινόμηση από τη φούσκα θα απαιτήσει ο (n) του χρόνου, και κατά μέσο όρο και το χειρότερο - O (N2).

Κατά τη σύνταξη του άρθρου, χρησιμοποιήθηκαν ανοιχτές πηγές διαδικτύου:

Υπάρχει ένας αρκετά μεγάλος αριθμός αλγορίθμων ταξινόμησης, πολλοί από αυτούς είναι πολύ συγκεκριμένοι και αναπτύσσονται για να λύσουν έναν στενό κύκλο εργασιών και να λειτουργούν με συγκεκριμένους τύπους δεδομένων. Αλλά ανάμεσα σε όλη αυτή την ποικιλομορφία, ο πιο απλούστερος αλγόριθμος αξίζει την ταξινόμηση των φυσαλίδων, η οποία μπορεί να εφαρμοστεί σε οποιαδήποτε γλώσσα προγραμματισμού. Παρά την απλότητα του, υπογραμμίζει πολλούς αρκετά πολύπλοκους αλγορίθμους. Ένα άλλο εξίσου σημαντικό πλεονέκτημα είναι η απλότητα του και, ως εκ τούτου, μπορεί να ανακληθεί και να εφαρμοστεί, χωρίς να έχει επιπλέον βιβλιογραφία πριν από τα μάτια.

Εισαγωγή

Το σύνολο του σύγχρονου Διαδικτύου είναι μια τεράστια ποσότητα δομών δεδομένων που συλλέγονται σε βάσεις δεδομένων. Περιέχουν κάθε είδους πληροφορίες, που κυμαίνονται από προσωπικά δεδομένα των χρηστών και τελειώνουν με τον σημασιολογικό πυρήνα εξαιρετικά έξυπνων αυτοματοποιημένων συστημάτων. Αξίζει να σημειωθεί ότι η ταξινόμηση των δεδομένων διαδραματίζει εξαιρετικά σημαντικό ρόλο σε αυτόν τον τεράστιο αριθμό δομημένων πληροφοριών. Η ταξινόμηση μπορεί να είναι ένα βήμα δέσμευσης πριν αναζητήσετε οποιαδήποτε πληροφορία στη βάση δεδομένων και η γνώση των αλγορίθμων ταξινόμησης διαδραματίζει εξαιρετικά σημαντικό ρόλο στον προγραμματισμό. Υπάρχει ένας αρκετά μεγάλος αριθμός αλγορίθμων ταξινόμησης, πολλοί από αυτούς είναι πολύ συγκεκριμένοι και αναπτύσσονται για να λύσουν έναν στενό κύκλο εργασιών και να λειτουργούν με συγκεκριμένους τύπους δεδομένων. Αλλά ανάμεσα σε όλη αυτή την ποικιλομορφία, ο πιο απλούστερος αλγόριθμος είναι άριστα Διαλογή φυσαλίδωνπου μπορούν να εφαρμοστούν σε οποιαδήποτε γλώσσα προγραμματισμού. Παρά την απλότητα του, υπογραμμίζει πολλούς αρκετά πολύπλοκους αλγορίθμους. Ένα άλλο εξίσου σημαντικό πλεονέκτημα είναι η απλότητα του και, ως εκ τούτου, μπορεί να ανακληθεί και να εφαρμοστεί, χωρίς να έχει επιπλέον βιβλιογραφία πριν από τα μάτια.

Ταξινόμηση των ματιών του μηχανήματος και τα μάτια του ανθρώπου

Ας φανταστούμε ότι πρέπει να ταξινομήσετε σε αύξουσα 5 στήλες διαφορετικών ύψη. Κάτω από αυτές τις στήλες, οποιαδήποτε πληροφορία μπορεί να γίνει κατανοητή (τιμές των μετοχών, το εύρος ζώνης καναλιού επικοινωνίας κλπ.), Μπορείτε να υποβάλετε κάποια επιλογή για αυτό το καθήκον να είναι πιο ξεκάθαρα. Λοιπόν, εμείς, ως παράδειγμα, θα ταξινομήσουμε τους εκδικητές από την ανάπτυξη:

Είσαι, σε αντίθεση με το πρόγραμμα του υπολογιστή, η ταξινόμηση δεν θα είναι καμία δουλειά, επειδή μπορείτε να δείτε την εικόνα στο σύνολό της και μπορείτε να εκτιμήσετε αμέσως τι έναν ήρωα όπου πρέπει να προχωρήσετε έτσι ώστε η ταξινόμηση της ανάπτυξης έχει ολοκληρωθεί με επιτυχία. Έχετε ήδη μαντέψει ότι για τη διαλογή για να αυξήσετε αυτή τη δομή δεδομένων, αρκεί να αλλάξετε τις αίθουσες και έναν σιδερένιο άτομο σε μέρη:

Ολοκληρώθηκε!

Και σε αυτή τη διαλογή θα ολοκληρωθεί με επιτυχία. Ωστόσο, η μηχανή υπολογιστών σε αντίθεση με το κάπως ηλίθιο δεν βλέπει πλήρως ολόκληρη τη δομή των δεδομένων. Το πρόγραμμα ελέγχου του μπορεί να συγκρίνει μόνο δύο τιμές ταυτόχρονα. Για να λύσετε αυτήν την εργασία, θα πρέπει να γίνει για να δημοσιεύσετε δύο αριθμούς στη μνήμη σας και να εκτελέσετε τη λειτουργία σύγκρισης πάνω τους, μετά από τα οποία πηγαίνετε σε άλλο ζεύγος αριθμών, και έτσι μέχρι να αναλυθούν όλα τα δεδομένα. Επομένως, οποιοσδήποτε αλγόριθμος ταξινόμησης είναι πολύ απλοϊκός, μπορεί να εκπροσωπείται από τρία βήματα:
  • Συγκρίνετε δύο στοιχεία.
  • Αλλάξτε τα μέρη ή αντιγράψτε ένα από αυτά.
  • Πηγαίνετε στο επόμενο στοιχείο.
Διαφορετικοί αλγόριθμοι μπορούν να εκτελέσουν αυτές τις λειτουργίες διαφορετικά, αλλά θα προχωρήσουμε στην εξέταση της αρχής της λειτουργίας της διαλογής των φυσαλίδων.

Διαλογή φυσαλίδων αλγορίθμου

Η ταξινόμηση των φυσαλίδων θεωρείται η απλούστερη, αλλά πριν περιγράψουμε αυτόν τον αλγόριθμο, ας φανταστούμε πώς ταξινομείτε τους εκδικητές από την ανάπτυξη, αν μπορούσαν, όπως και το αυτοκίνητο να συγκρίνει μόνο δύο ήρωες σε μια στιγμή. Πιθανότατα, θα έχετε φτάσει (το πιο βέλτιστο) ως εξής:
  • Μεταβαίνετε στο μηδενικό στοιχείο του πίνακα μας (μαύρη χήρα).
  • Συγκρίνετε το μηδενικό στοιχείο (μαύρο χήρα) με το πρώτο (Halkom).
  • Εάν το στοιχείο στη μηδενική θέση αποδείχθηκε υψηλότερη, αλλάζετε τα σε μέρη.
  • Διαφορετικά, εάν το στοιχείο στη μηδενική θέση είναι μικρότερη, τα αφήνετε στα μέρη μας.
  • Να παράγουν στη θέση προς το δεξί προς τα δεξιά και να επαναλάβετε τη σύγκριση (συγκρίνετε το hulk με τον καπετάνιο)

Αφού πάτε με έναν τέτοιο αλγόριθμο σε όλη τη λίστα σε ένα πέρασμα, η ταξινόμηση θα γίνει εντελώς. Αλλά, αλλά το μεγαλύτερο στοιχείο της λίστας θα μεταφερθεί στην ακραία δεξιά θέση. Θα συμβεί πάντα, διότι μόλις βρείτε το μεγαλύτερο στοιχείο, θα πάρετε όλη την ώρα θα το αλλάξετε μέρη μέχρι να μετακινηθείτε στο πιο εύκολο. Δηλαδή, μόλις το πρόγραμμα "βρίσκει" το Hulk στη συστοιχία, θα το μετακινήσει περαιτέρω στο τέλος της λίστας:

Αυτός είναι ο λόγος για τον οποίο αυτός ο αλγόριθμος ονομάζεται διαλογή φυσαλίδων, δεδομένου ότι ως αποτέλεσμα της εργασίας του το μεγαλύτερο στοιχείο στη λίστα αποδεικνύεται ότι βρίσκεται στην κορυφή της σειράς και όλα τα μικρότερα στοιχεία θα μετατοπιστούν σε μία θέση προς τα αριστερά:

Για να ολοκληρώσετε τη διαλογή, θα χρειαστεί να επιστρέψετε στην αρχή του πίνακα και να επαναλάβετε τα πέντε βήματα που περιγράφονται παραπάνω, κινείται και πάλι προς τα δεξιά, συγκρίνοντας και με την ανάγκη μετακίνησης αντικειμένων. Αλλά αυτή τη φορά θα πρέπει να σταματήσετε τον αλγόριθμο για ένα στοιχείο μέχρι το τέλος της συστοιχίας, επειδή γνωρίζουμε ήδη ότι στην ακραία δεξιά θέση είναι απολύτως με ακρίβεια το μεγαλύτερο στοιχείο (Hulk):

Έτσι, το πρόγραμμα πρέπει να έχει δύο κύκλους. Για μεγαλύτερη σαφήνεια, προτού προχωρήσουμε στην εξέταση του κώδικα προγράμματος, αυτός ο σύνδεσμος μπορείτε να εξοικειωθείτε με την απεικόνιση του έργου της διαλογής των φυσαλίδων: απεικόνιση της ταξινόμησης των φυσαλίδων

Πωλήσεις ταξινόμησης φυσαλίδων στη γλώσσα Java

Για να αποδείξει το έργο της ταξινόμησης στην Java, δίνουμε τον κωδικό του προγράμματος ότι:
  • δημιουργεί μια σειρά από 5 στοιχεία.
  • φορτώνει την ανάπτυξη των εκρηκτικών.
  • Εμφανίζει τα περιεχόμενα του πίνακα.
  • πωλεί ταξινόμηση φυσαλίδων.
  • Επαναλαμβάνει την οθόνη του ταξινομημένου συστοιχιού.
Ο κώδικας μπορεί να βρεθεί παρακάτω, και ακόμη και να το κατεβάσετε στο αγαπημένο σας intellij IDE. Η ανάλυση του θα πραγματοποιηθεί παρακάτω: η τάξη ArrayBubble (ιδιωτική μακρά α; // Σύνδεση σε έναν πίνακα Ιδιωτικές Ερενέργειες. // αριθμός στοιχείων στη συστοιχία Δημόσια arraybubble (int max) ( // Σχεδιαστής κατηγορίας a \u003d νέο μακρύ [max]; // Δημιουργία μιας σειράς Max elems \u003d 0; // Κατά τη δημιουργία ενός πίνακα περιέχει 0 στοιχεία ) Δημόσιο κενό σε (μακρά αξία) ( // στοιχείο εισαγωγής Μέθοδος σε πίνακα Ένα [elems] \u003d τιμή? // Εισαγωγή τιμής σε πίνακα Α Elems ++; // Το μέγεθος του πίνακα αυξάνεται ) Δημόσιο κενό εκτυπωτή () ( // Μέθοδος εξόδου της συστοιχίας στην κονσόλα για (int i \u003d 0; i rems ; I ++) ( // για κάθε στοιχείο του πίνακα Σύστημα. Εξω. Εκτύπωση (A [I] + "). // φέρτε στην κονσόλα Σύστημα. Εξω. Println (""); // από το σύστημα νέας γραμμής). Εξω. Println ( "---- Τέλος της παραγωγής του πίνακα ----") ) Ιδιωτικό κενό TOSWAP (πρώτο πρώτο, Int δεύτερο) ( // Η μέθοδος αλλάζει σε μέρη ένα ζευγάρι αριθμών πίνακα μακρύ dummy \u003d ένα [πρώτο]? // στην προσωρινή μεταβλητή τοποθετούμε το πρώτο στοιχείο Ένα [πρώτο] \u003d ένα [δεύτερο]. // στη θέση του πρώτα βάλτε το δεύτερο στοιχείο ένα [δεύτερο] \u003d ανδρείκελο? // αντί για το δεύτερο στοιχείο που γράφουμε την πρώτη από τη μνήμη ώρας ) Δημόσιο κενό Bubblester () (για (int Out \u003d Elems - 1; Out\u003e ; Στο ++) ( // Εσωτερικός κύκλος αν (ένα [σε]\u003e Α [σε + 1]) TOSWAP (σε, σε + 1). ))) Κύριο δημόσιας κλάσης (δημόσιο στατικό κενό κύριο (Array Strybubble) (ArrayBubble Array \u003d Νέο ArrayBubble (5). // Δημιουργήστε μια συστοιχία πίνακα για 5 στοιχεία Πίνακας. Σε (163). // Συμπληρώστε μια συστοιχία Πίνακας. Ino (300); Πίνακας. Ino (184); Πίνακας. Σε (191). Πίνακας. (174). Πίνακας. Εκτυπωτής (); // Εμφάνιση στοιχείων πριν τη διαλογή Πίνακας. Bubblesterorter (); // χρησιμοποιήστε τη διαλογή των φυσαλίδων Πίνακας. Εκτυπωτής (); // Επαναλάβετε ξανά το YPisok } } Παρά τα λεπτομερή σχόλια στον κώδικα, δίνουμε μια περιγραφή ορισμένων μεθόδων που παρουσιάζονται στο πρόγραμμα. Βασικές μέθοδοι που εκτελούν την κύρια εργασία στο πρόγραμμα γράφονται στην κατηγορία ArrayBubble. Η τάξη περιέχει έναν κατασκευαστή και διάφορες μεθόδους:
  • Σε μέθοδο εισαγωγής στοιχείων σε μια συστοιχία.
  • Εκτυπωτής - Εμφανίζει τα περιεχόμενα της γραμμής πίνακα.
  • Το TOSWAP - βάζει αντικείμενα σε θέσεις εάν είναι απαραίτητο. Για να το κάνετε αυτό, χρησιμοποιήστε το προσωρινό φορητό ανδρείκελο, όπου καταγράφεται η τιμή του πρώτου αριθμού και μια τιμή από τον δεύτερο αριθμό καταγράφεται στη θέση του. Μετά από αυτό, το περιεχόμενο από τη μεταβλητή χρόνου είναι γραμμένη στον δεύτερο αριθμό. Αυτή είναι μια τυποποιημένη παραλαβή των αναδιατάξεων ανά τόπους δύο στοιχείων.

    Και τέλος, η κύρια μέθοδος:

  • bubblesteror - η οποία κατασκευάζει την κύρια εργασία και ταξινομεί τα δεδομένα που είναι αποθηκευμένα στη συστοιχία, για άλλη μια φορά το παρουσιάζουμε ξεχωριστά:

    Δημόσιο κενό Bubbsorter () ( // Μέθοδος ταξινόμησης φυσαλίδων Για (int out \u003d elems - 1; out\u003e \u003d 1; έξω--) (// εξωτερικός κύκλος για (int in \u003d 0; μέσα έξω ; Στο ++) ( // Εσωτερικός κύκλος Αν (ένα [σε]\u003e A [σε + 1]) // εάν η σειρά των στοιχείων έχει σπάσει Toswap (σε, στο + 1). // καλέστε τη μέθοδο που αλλάζει σε μέρη } } }
Εδώ πρέπει να δώσετε προσοχή στα δύο μέτρα: Εξωτερικά και εσωτερικά μέσα. Εξωτερικός αντίγραφο. Αρχίζει την προτομή των τιμών από το τέλος της συστοιχίας και μειώνεται σταδιακά με κάθε νέο πέρασμα ανά μονάδα. Η μεταβλητή με κάθε νέο πέρασμα μετατοπίζεται σε όλα τα αριστερά για να μην επηρεαστεί οι τιμές που έχουν ήδη ταξινομηθεί στη δεξιά πλευρά του πίνακα. Εσωτερικός μετρητής μέσα Αρχίζει την προτομή των τιμών από την αρχή του πίνακα και αυξάνεται σταδιακά από ένα σε κάθε νέο πέρασμα. Αύξηση του σε συμβαίνει μέχρι να φτάσει στο τελευταίο στοιχείο που αναλύεται στην τρέχουσα κάρτα). Ο εσωτερικός κύκλος παράγει μια σύγκριση δύο γειτονικών κελιών και σε + 1 κύτταρα. Εάν στο εσωτερικό είναι αποθηκευμένο από το σε + 1, τότε η μέθοδος TOSWAP ονομάζεται, η οποία αλλάζει αυτούς τους δύο αριθμούς σε μέρη.

συμπέρασμα

Ο αλγόριθμος της ταξινόμησης των φυσαλίδων είναι ένας από τους πιο αργούς. Εάν η συστοιχία αποτελείται από n στοιχεία, τότε το πρώτο πέρασμα θα διεξαχθεί με συγκρίσεις Ν-1, στο δεύτερο Ν-2, στη συνέχεια Ν-3, κλπ. Δηλαδή, τα περάσματα θα εκτελεστούν: (Ν - 1) + (Ν-2) + (Ν-3) + ... + 1 \u003d Ν Χ (Ν-1) / 2 Έτσι, κατά τη διαλογή του αλγορίθμου εκτελεί περίπου 0,5x (n ^ 2) συγκρίσεις. Για n \u003d 5, η ποσότητα συγκρίσεων θα είναι περίπου 10, για n \u003d 10 η ποσότητα συγκρίσεων θα αυξηθεί σε 45. Έτσι, με αύξηση του αριθμού των στοιχείων, η πολυπλοκότητα της ταξινόμησης αυξάνεται σημαντικά:

Η ταχύτητα του αλγορίθμου επηρεάζει όχι μόνο τον αριθμό των περλοίων, αλλά και ο αριθμός των μεταβολών που θα απαιτηθούν. Για τυχαία δεδομένα, ο αριθμός των μεταβολών κατά μέσο όρο είναι (n ^ 2) / 4, δηλαδή περίπου το μισό μικρότερο από τον αριθμό των διερχομένων. Ωστόσο, στη χειρότερη περίπτωση, ο αριθμός των μεταβολών μπορεί επίσης να είναι n ^ 2/2 - αυτό είναι εάν τα δεδομένα αρχικά ταξινομούνται με αντίστροφη σειρά. Παρά το γεγονός ότι αυτός είναι ένας επαρκώς αργός αλγόριθμος διαλογής, γνωρίζει και καταλάβει πώς λειτουργεί πολύ σημαντικό, εκτός, όπως αναφέρθηκε προηγουμένως, αποτελεί τη βάση για πιο πολύπλοους αλγορίθμους. JGD!

Γεια σε όλους!

Σήμερα θα εξετάσουμε τη διαλογή με τη μέθοδο "Bubble". Αυτός ο αλγόριθμος χρησιμοποιείται συχνά σε σχολεία και πανεπιστήμια, οπότε θα χρησιμοποιήσουμε τη γλώσσα Pascal. Και, έτσι τι είναι η ταξινόμηση; Η ταξινόμηση είναι η παραγγελία στοιχείων από μικρότερη έως περισσότερο (ταξινόμηση σε αύξουσα) ή από ένα μεγαλύτερο στοιχείο σε μικρότερο (φθίνουσα φθίνουσα). Ταξινόμηση συνήθως συστοιχιών.

Υπάρχουν διάφοροι αλγόριθμοι ταξινόμησης. Μερικοί, καλά ταξινομήστε ένα μεγάλο αριθμό στοιχείων, άλλα, πιο αποτελεσματικά με έναν πολύ μικρό αριθμό αντικειμένων. Η μέθοδος φυσαλίδων μας είναι χαρακτηριστική:


Πλεονεκτήματα:
  • Εύκολο στην εφαρμογή αλγορίθμου
  • Ωραίο όνομα
Μοιραστείτε:
  • Μία από τις πιο αργές μεθόδους διαλογής (χρόνος εκτέλεσης εξαρτάται σε τετραγωνικά εξαρτάται από το μήκος του πίνακα N 2)
  • Σχεδόν δεν χρησιμοποιείται στην πραγματική ζωή (χρησιμοποιείται κυρίως για εκπαιδευτικούς σκοπούς)
Ας έχουμε μια συγκεκριμένη σειρά: 3 1 4 2

Αλγόριθμος: Παίρνουμε ένα στοιχείο του πίνακα, συγκρίνουμε με τα παρακάτω αν το στοιχείο μας, περισσότερο από το επόμενο στοιχείο, τότε τα αλλάζουμε σε μέρη. Μετά τη διέλευση από ολόκληρο τον πίνακα, μπορούμε να είμαστε σίγουροι ότι το μέγιστο στοιχείο θα "ωθεί" - και θα σταθεί το πιο τελευταίο. Έτσι, ένα στοιχείο είναι ήδη ακριβώς στη θέση τους. Επειδή Πρέπει λοιπόν να τα τοποθετήσουμε όλοι στον τόπο μας, πρέπει λοιπόν να επαναλάβουμε αυτή τη λειτουργία, όσες φορές έχουμε τα στοιχεία της συστοιχίας μείον 1. Το τελευταίο στοιχείο θα σταθεί αυτόματα αυτόματα αν το υπόλοιπο στέκεται στα μέρη τους.

Ας επιστρέψουμε στη διάταξη: 3 1 4 2
Παίρνουμε το πρώτο στοιχείο "3" που συγκρίνονται με τα ακόλουθα "1". Επειδή "3"\u003e "1", τότε αλλάζουμε θέσεις:
1 3 4 2
Τώρα συγκρίνοντας το "3" και "4", η τρόικα δεν είναι κάτι περισσότερο από το τέταρτο, δεν σημαίνει τίποτα. Στη συνέχεια, συγκρίνετε το "4" και "2". Τέσσερα περισσότερα από δύο - σημαίνει ότι αλλάζουμε θέσεις: 1 3 2 4. Ο κύκλος τελείωσε. Έτσι το μεγαλύτερο στοιχείο που έχει ήδη να σταθεί στη θέση του !! Βλέπουμε ότι έχουμε συμβεί. Όπου "4" (το μεγαλύτερο στοιχείο μας) δεν ήταν - είναι ακόμα, αφού περάσει από τον κύκλο ολόκληρου του πίνακα, θα είναι το τελευταίο. Αναλογία - Καθώς μια φυσαλίδα αέρα επιπλέει στο νερό - και τα δύο μας στοιχείο εμφανίζονται σε μια σειρά. Ως εκ τούτου, ο αλγόριθμος ονομάζεται "ταξινόμηση φούσκας". Για να τοποθετήσετε το επόμενο στοιχείο, πρέπει πρώτα να ξεκινήσετε τον κύκλο, αλλά το τελευταίο στοιχείο δεν μπορεί πλέον να θεωρείται επειδή είναι στη θέση του.


Συγκρίνετε το "1" και "3" - δεν αλλάζουμε τίποτα.
Συγκρίνετε τα "3" και "2" - τρία περισσότερα από δύο, τότε αλλάζουμε θέσεις. Αποδεικνύεται: 1 2 3 4. Ο δεύτερος κύκλος ολοκληρώθηκε. Έχουμε ήδη κάνει δύο κύκλους - αυτό σημαίνει ότι μπορούμε να πούμε ότι έχουμε, τα δύο τελευταία στοιχεία έχουν ήδη ταξινομηθεί. Παραμένει να ταξινομήσετε το τρίτο στοιχείο και το τέταρτο, θα αυξηθεί στο σωστό μέρος, αυτόματα. Για άλλη μια φορά, συγκρίνουμε το πρώτο στοιχείο και το δεύτερο - βλέπουμε ότι έχουμε τα πάντα στα μέρη μας, σημαίνει ότι μια συστοιχία μπορεί να ληφθεί υπόψη, ταξινομημένη με αυξανόμενα στοιχεία.

Τώρα παραμένει να προγραμματίσουμε τον αλγόριθμο στη γλώσσα του Pascal. const n \u003d 4; (Φέρνουμε τη σταθερά, θα είναι το μήκος του πίνακα) var i, j, k: ακέραιο. (Δύο μεταβλητές για τον επενδυμένο κύκλο, ένα για να αλλάξετε τα στοιχεία σε μέρη) m: πίνακα ακέραιου. (Φέρνουμε τον πίνακα) ξεκινάμε (θα ζητήσουμε μια σειρά από το πληκτρολόγιο :) writeln ("Εισάγετε μια σειρά:"); Για i: \u003d 1 έως n ξεκινήστε writeln (i, "στοιχείο:"); Readln (m [i]); τέλος; (Ο εξωτερικός κύκλος είναι υπεύθυνος για το γεγονός ότι πρέπει να επαναλάβουμε τον εσωτερικό κύκλο όσες φορές με τα στοιχεία της σειράς μείον 1.) για i: \u003d 1 έως n-1 αρχίστε (ο εσωτερικός κύκλος κινείται ήδη τα στοιχεία και συγκρίνει ο ένας τον άλλον.) Για το J: \u003d 1 στο Ni ξεκινήστε (αν ένα στοιχείο, περισσότερο από το επόμενο, στη συνέχεια αλλάξτε τα μέρη.) Εάν m [j]\u003e άνδρες ξεκινούν k: \u003d m [j]; m [j]: \u003d m; Μ: \u003d k; τέλος; τέλος; τέλος; (Εξάγετε το αποτέλεσμα :) για i: \u003d 1 έως n γράψτε (m [i], ""); τέλος.
Εδώ είναι το αποτέλεσμα:

Αλλά το σεμινάριο βίντεο

Συνεχίζοντας το θέμα:
Δίκτυο

Μετά την πρώτη εμφάνιση του δισκίου στην αγορά συσκευών του υπολογιστή, δεν υπήρχε χρόνο, καθώς ένας tablet PC έγινε ανεξάρτητη μονάδα. Παγκόσμια μάρκες όπως η Samsung και η Apple ...