Radix-Sort ein Array von Zeichenfolgen?
Habe ich schon seit Jahren herum, und während ich habe herausgefunden, das der Allgemeinen Idee der Verwendung von Radix-Sortierung alphabetisch ein array von strings, ich weiß, ich werde die falsche Richtung.
Dies ist, was ich habe, so weit:
void radixSort(string* sortMe, int l)
{
queue<string>* sections = new queue<string>[27]; //Have a-z, and also one for strings that are null terminated.
for(int i = 0; i < numElements; i++)
{
if(!(sortMe[i][l] == 32))
sections[sortMe[i][l]-96].push(sortMe[i]); //-96 because the ascii code for a is 97. If, for example a is the character, it will be placed at 1. 0 is left for null characters
}
for(int i =0; i < 26; i++)
{
while(!sections[i].empty())
{
temp.push_back(sections[i].front());
sections[i].pop();
}
}
}
Was ich bisher sortiert werden alle Zeichenfolgen, die durch das erste Zeichen, und ich weiß, dass ich dann zu Durchlaufen haben und machen subarrays der verbleibenden Zeichen und Sortieren Sie diese, aber wie kann ich es effizient umsetzen? Die Saiten sind von variabler Größe und können Leerzeichen, zum Beispiel:
- unterteilt
- main street
- Hose
- aufgespießt decolonizing
- tonig
- axial satisfactoriness
- temperamentvoll
- hypersensitiveness
- trägt
- hairbreadths
- Cremes überspannungen
- unlaboured
- hoosier
- buggiest
- Mauretanier
- emanators
- acclaiming
- zouaves dishpan
- Latschen
- solarisms
- remunerativeness
- solubilizing
- gemeißelt
- Gurgel
- ooziness
- toastier
- baud
- Suffix
- machtlos treiben
- disassimilated
- keucht
- flirtier
- uh
Dies ist etwas, das ich gefunden, dass scheint, wie es von nutzen sein:
http://algs4.cs.princeton.edu/lectures/51DemoKeyIndexedCounting.pdf
- Radix-sort ist nicht gut geeignet für Elemente, die in unterschiedlicher Größe.
- Ja, leider ist dies der Letzte Teil eines Projekts, das ich habe, wo ich die Implementierung der verschiedenen Sortier-algorithmen und vergleichen deren Ausführungszeit. Ich auf jeden Fall tun, wünschte, ich könnte eine andere Methode verwenden!
- Ich habe 3 Vorschläge. 1: die Möglichkeit für mehr als nur die 27 möglichen Eingaben. Zum Beispiel haben Sie Räume, in einige der Elemente zu Sortieren. 2: verwenden Sie Rekursion. 3: erkennen, dass eine Eingabe von nur einem element oder weniger bereits sortiert.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Folien, die Sie gefunden haben, sind toll! Aber wo sind denn die Warteschlangen kommen aus in deinem code?
Sowieso, hier sind Sie (live-Beispiel):
die Sie verwenden können, wie das
wo
generate()
enthalten ist, in das lebende Beispiel und erzeugt die Zeichenketten in Ihre Frage.Ich versuche nicht zu erklären, wie das hier funktioniert, ich nehme an, Sie herausfinden können, da Sie an dem problem arbeiten. Aber ein paar Kommentare sind in Ordnung.
Wir sind weder Sortieren der Eingangs-Sequenz, in -, noch für die Rückgabe einer sortierten Kopie; wir sind gerade zurück eine Sequenz von Positionen von Eingabe-Elemente in der sortierten Reihenfolge.
Sind wir Verarbeitung von strings von rechts nach Links.
Die Komplexität ist
O(lw)
wol
ist der input length (Anzahl der Eingabezeichen) undw
ist die maximale Eingangs-Breite (max. Länge aller input-strings). Damit dieser Algorithmus macht Sinn, wenn die string-Breite nicht zu stark variieren.Dem ersten template-parameter
R
vonradix_sort()
ist die Anzahl der möglichen Werte für die einzelnen Ziffern (Buchstaben) in der Eingabe. E. g.R = 128
bedeutet, dass die möglichen Werte sind0..127
. Dies sollte in Ordnung sein für deinen input. Ich habe nicht versucht, etwas zu tun, der gut mit Bezug auf ASCII-codes, aber Sie können anpassen, Funktionbin()
für, die.In der Ausgabe von
bin()
, Wert0
reserviert ist, zu verstehen, "wir sind über das Ende des Strings". Solche Zeichenfolgen platziert werden, bevor andere, die sind noch im Gange.Habe ich versucht zu geben, sich selbst erklärende Namen für Variablen und Funktionen, und verwenden Sie die standard-Bibliothek aufruft, für Allgemeine Aufgaben, soweit möglich.
Den code generisch ist, z.B. kann jede Art random-access-container mit random-access-Container, nicht nur für Vektoren von strings.
Ich bin mit C++11-features hier und da, für die Bequemlichkeit, aber nichts ist wirklich notwendig: man könnte leicht das gleiche tun, nur mit C++03.
typedef
.Sehr ähnlich iavr, aber die Sortierung in-place (Benchmarks gegen iavr Lösung mit g++ -O3 und dauert etwa 2020ms im Vergleich zu iavr ist 1780ms), genießen ein regelmäßige Oberfläche und wiederverwendbar-code. Das problem mit Iavr Umsetzung ist, dass seine Logik funktioniert nur mit Container von strings, und ist nicht leicht erweiterbar, um andere Arten. Offensichtlich seine spezielle version die effizientere ist, aber es könnte sich lohnen, es zu opfern Leistung für die Regelmäßigkeit.
Finden Sie den rest des Codes an radix-sort-Implementierung
Allgemeinen Radix-Sortierung:
Zählen, Sortieren, Sortieren auf jeder Stelle (in place):
Extrahieren Wert der Stelle: