
Bei Verteilungssortierungen werden Elemente verteilt und in Klassen neu verteilt, bis das Array sortiert ist.
Im allgemeinsten Fall geschieht dies ungefĂ€hr auf die gleiche Weise. Elemente werden nach einem bestimmten Kriterium nach Klassen gestreut. Wenn dies nicht zur Reihenfolge des Arrays fĂŒhrt, werden die Attribute der Klasse verfeinert und die Elemente erneut auf die verfeinerten Klassen verteilt. Und dies geschieht, bis das Array geordnet wird.
Bei der Sortierung nach Verteilung gibt es fast immer keine Vergleiche von Elementen untereinander und deren Austausch. Die Hauptsache ist, ob das Element zu einer bestimmten Klasse gehört oder nicht, sein Vergleich mit anderen Elementen spielt selten eine Rolle.
Typischerweise weisen diese Sortierungen eine lineare ZeitkomplexitĂ€t auf (und nicht logarithmisch, wie bei effizienten Arten von Austauschen, ZusammenfĂŒhren, AuswĂ€hlen oder EinfĂŒgen). AuĂerdem benötigen die Algorithmen dieser Klasse fast immer viel zusĂ€tzlichen Speicher, da die nach Klassen gruppierten Elemente irgendwo gespeichert werden mĂŒssen.
Verteilungssortierungen eignen sich zum Sortieren von Ganzzahlen und Zeichenfolgen. Das Sortieren von reellen Zahlen mit ihnen ist normalerweise unpraktisch. AuĂerdem sortiert die Verteilung Arrays, die aus sich wiederholenden Zahlen bestehen, perfekt - je mehr Wiederholungen, desto weniger unterschiedliche Klassen sind erforderlich.

Dieser Artikel wurde mit UnterstĂŒtzung von EDISON verfasst.
Kundenmeinung : 10 Pluspunkte Programmierer von EDISON
Das ist interessant und nĂŒtzlich zu wissen: FrĂŒhstĂŒcksprogrammierer
Stellen Sie sich einen Algorithmus vor, der die oben genannten Eigenschaften am konvexsten demonstriert.
Eimersortierung :: Eimersortierung
Andere Namen sind Korbsortierung, Blocksortierung, Taschensortierung.
Wir streuen Zahlen in Körbe, dann in jeden Korb in kleinere Körbe und so weiter, bis auf einer bestimmten Ebene im Korb nur noch dieselben Elemente vorhanden sind. Dann ist es aus solchen Körben der niedrigsten Ebene einfach, das Array in einem geordneten Zustand wiederherzustellen.
Lassen Sie uns anhand eines konkreten Beispiels erklÀren. Nehmen wir an, wir haben ein ungeordnetes Array. Es ist bekannt, dass dieses Array Zahlen von 1 bis 8 enthÀlt.

Wir werfen diese Zahlen in zwei Gruppen: Zahlen von 1 bis 4 fallen in eine Gruppe, von 5 bis 8 in die zweite. Dann verteilen wir die Zahlen im ersten Korb auf zwei Körbe: in eine Nummer 1 und 2 und in die anderen 3 und 4. Wir verteilen diese Körbe auch in Bastkörbe, die bereits gleich groĂe Nummern enthalten. Auf diesen groĂen Korb mit Zahlen von 5 bis 8 wenden wir eine Ă€hnliche Rekursion an.
Dann geben wir aus kleinen Körben, von denen jeder die gleichen Zahlen enthĂ€lt, die Elemente in der Reihenfolge ihrer PrioritĂ€t an das Hauptarray zurĂŒck.
Die nukleare Sortierung in dieser Form ist in der Praxis nicht besonders anwendbar, zeigt jedoch standardmĂ€Ăig, wie alle Sortierungen nach Verteilung im Allgemeinen funktionieren.
Thanos sort :: Thanos sort
Manchmal werden mir Autorensorten geschickt, und das ist genau so. Der Autor Andrei Danilin nannte es "russische Sortierung in HÀlften", aber ich nannte es die Sortierung von Thanos. Wenn wir formal von den verwendeten Methoden ausgehen, können wir die arithmetische mittlere Sortierung nennen.

Das arithmetische Mittel der Elemente wird im Array berechnet und dann werden alle Elemente in 2 Gruppen verteilt. Elemente, die kleiner als (oder gleich) dem arithmetischen Mittel sind, gehen an eine Gruppe, gröĂer als das arithmetische Mittel an die zweite Gruppe. Dann werden dieselben Aktionen rekursiv auf beide Gruppen angewendet - und so weiter bis zum bitteren Ende.
Und was ist mit verrĂŒcktem Titan? Wenn dies ein zufĂ€lliges Array ist, hat das Element im Vergleich zum arithmetischen Mittel im GroĂen und Ganzen eine 50/50-Chance, dass es in eine von zwei Gruppen geht.
Im Internet bin ich ĂŒbrigens auf einen anderen Comic-Algorithmus mit demselben Namen gestoĂen. Wenn das Array nicht sortiert ist, klicken Sie auf den Infinity-Handschuh und senden Sie die zufĂ€llig ausgewĂ€hlte HĂ€lfte der Array-Elemente an Nichtexistenz. Wenn die Ăberlebenden eine geordnete Gruppe bilden, kann ihre groĂe Mission als erfĂŒllt betrachtet werden. Wenn nicht bereits, können Sie noch ein paar Klicks machen.

Aber zurĂŒck zu unseren Verteilungssortierungen. Alle können in nur zwei Gruppen unterteilt werden -
Sortieren und
bitweise Sortieren . Wenn Sie möchten, können Sie auch
ZÀhlbit-Sortierungen hervorheben , d. H. diejenigen, die beiden zugeschrieben werden können.
Es gibt auch hybride Algorithmen (solche, die Methoden verschiedener Klassen verwenden, z. B. Tims Sortierung ist eine Kreuzung zwischen ZusammenfĂŒhrungssortierung und EinfĂŒgungssortierung, introspektive Sortierung ist eine schnelle Sortierung, die in eine BĂŒndelsortierung usw. geht), einschlieĂlich Verteilungssortierungen Hybriden sind jedoch ein separater Abschnitt. Ăber sie spĂ€ter.
Tausende Sortierungen und arithmetische Mittelsortierungen beziehen sich auf das ZĂ€hlen von Sortierungen.
Sorten zÀhlen
Die Grundidee ist, dass wir zÀhlen, wie viele Zahlen in jeder Klasse sind.
ZĂ€hlsortierung :: ZĂ€hlsortierung
Wir zÀhlen, wie oft die eine oder andere Zahl im Array vorkommt. Wenn wir diese Mengen kennen, bilden wir schnell ein bereits geordnetes Array.

FĂŒr diese Sortierung mĂŒssen Sie das Minimum und Maximum im Array kennen. Dann werden die SchlĂŒssel fĂŒr das Hilfsarray generiert, in dem wir festlegen, was und wie oft es getroffen wurde.
Python-Code:
def CountingSort(array, mn, mx): count = defaultdict(int) for i in array: count[i] += 1 result = [] for j in range(mn,mx+1): result += [j]* count[j] return result
Pigeon Sort :: Pigeonhole sort
Wir gehen durch das Array, wenn eine neue Nummer gefunden wird, dann starten wir den ZĂ€hler (als SchlĂŒssel der Hilfsliste) dieser Nummer. Wenn die Nummer nicht zum ersten Mal gefunden wird, wird das Inkrement fĂŒr diesen ZĂ€hler einfach ausgelöst.

Der Unterschied zur vorherigen Methode besteht darin, dass wir beim Sortieren durch ZĂ€hlen sofort ZĂ€hler fĂŒr alle möglichen Zahlen starten, die im Array auftreten können (wir können es uns leisten, wenn das Maximum und das Minimum im Array bekannt sind). Einige Zahlen erscheinen nie und ihre ZĂ€hler zeigen Null. Bei der Taubensortierung starten wir ZĂ€hler nur fĂŒr die Zahlen, die tatsĂ€chlich im Array vorkommen. Bei der ZĂ€hlsortierung fĂŒr ZĂ€hler wird ein Array verwendet, und bei der Taubensortierung wird eine doppelt verknĂŒpfte Liste verwendet, mit der Sie unterwegs neue ZĂ€hler hinzufĂŒgen können.
Diese Methode wird manchmal alternativ als
Dirichlet-Sortierung bezeichnet , da der Algorithmus selbst verschiedene Konsequenzen des Dirichlet-Prinzips veranschaulicht.
Wenn N Objekte auf M Container verteilt sind und N> M, enthÀlt mindestens ein Container mehr als ein Element.
Python-Code:
def PigeOnHoleSort(a): mi = min(a) size = max(a) - mi + 1 holes = [0] * size for x in a: holes[x - mi] += 1 i = 0 for count in range(size): while holes[count] > 0: holes[count] -= 1 a[i] = count + mi i += 1
Bitsortierung
Wir verteilen die Nummern abhĂ€ngig davon, welche Ziffer in einer bestimmten Kategorie der Nummer enthalten ist. Wenn wir dies mehrmals fĂŒr verschiedene Ziffern tun, erhalten wir plötzlich ein sortiertes Array.
Bitweise Sortierung niedriger Ordnung :: LSD-Radix-Sortierung

Wir wechseln von den unteren zu den Àlteren Ziffern und verteilen bei jeder Iteration die Elemente des Arrays, je nachdem, welche Ziffer in der Ziffer enthalten ist.
Nach der nĂ€chsten Verteilung geben wir die Elemente in der Reihenfolge an das Hauptarray zurĂŒck, in der die Elemente bei der nĂ€chsten Umverteilung in die Klassen fielen.
FĂŒr bitweise Sortierungen ist es wichtig, dass Elemente die gleiche Anzahl von Ziffern haben. Wenn die tatsĂ€chliche Anzahl der Ziffern unterschiedlich ist, wird das Problem gelöst, indem zusĂ€tzliche Nullen als höhere Ziffern hinzugefĂŒgt werden.
Bitweise Sortierung höherer Ordnung :: MSD-Radix-Sortierung

Erstens verteilen wir uns auf die höheren RĂ€nge, von denen wir zu den jĂŒngeren wechseln.
Diese Option ist schwieriger zu implementieren, da der Ăbergang zu den unteren Ziffern innerhalb der Klassen und nicht unter allen Elementen des Arrays rekursiv durchgefĂŒhrt wird.
Diese KomplexitĂ€t wird jedoch durch die Tatsache belohnt, dass MSD schneller als LSD ist. Wenn Sie von den unteren zu den Ă€lteren Ziffern wechseln, mĂŒssen Sie alle Ziffern aller Zahlen verarbeiten, um richtig zu sortieren. Wenn Sie von Ă€lter zu jĂŒnger wechseln, mĂŒssen Sie tatsĂ€chlich nicht alle Ziffern aller Zahlen verarbeiten. Der sortierte Status kommt in der Regel frĂŒher.
Die meisten bitweisen Sortierungen sind eine Variation der effizienteren MSD. Dies ist besonders nĂŒtzlich zum Sortieren von Zeichenfolgen. Hierzu wird normalerweise ein Suffixbaum verwendet. Wir werden in einem der folgenden Artikel analysieren.
Bitweise Sortierung zÀhlen
Manchmal ist die Verteilungssortierung gleichzeitig zÀhlbar und bitweise.
Perlensortierung :: Perlensortierung

Andere Namen des Algorithmus: Abakussortierung, Schwerkraftsortierung.
Ich habe bereits einige Male ĂŒber diese Sortierung geschrieben (
1 ,
2 ), daher werde ich mich kurz fassen, nur die Essenz.
Angenommen, jede Zahl in einem Array ist eine Reihe von Kugeln, die Anzahl der Kugeln ist der Wert einer Zahl. Wenn wir die Zahlen als horizontale Reihen dieser Kugeln aufeinander anordnen und sie dann ganz vertikal verschieben, erhalten wir ein geordnetes Array.
Der Trick dabei ist, dass wir jede Zahl mit BÀllen in einem unÀren Zahlensystem darstellen. TatsÀchlich zÀhlen wir einfach, wie oft alle Zahlen jede Ziffer haben.
BeadSort in Python in einer Zeile:
Nach einer Weile werden wir komplexere zÀhlbitweise Sortierungen analysieren, unter denen die Sortierung unter
amerikanischer Flagge einen herausragenden Platz einnimmt.
Referenzen
Eimer /
Eimer ,
ZĂ€hlen /
Pigeonhole /
Dirichlet ,
Radix /
Entladungen ,
PerleSerienartikel:
Die AlgoLab Excel-Anwendung wurde erheblich aktualisiert. Einige Algorithmen aus dem heutigen Artikel erschienen dort zum ersten Mal. Aktualisieren Sie, wer verwendet.