position phrasen sortieren
-
Hallo zusammen, hoffentlich kann mir hier jemand helfen:
Ich habe einen Text in dem ich immer 3 Wörter zu einer Phrasen zusammengenommen habe.
Die jeweiligen Positionen des Anfangs jeder Phrase habe ich in einem eigenen Vektor gespeichert.Ich versuche gerade, die Postionion in letzerem Vektor zu sortieren, so dass die phrasen am ende alphabetisch geordnet sind (also wenn z.b die phrase die bei 4 anfängt alphabetisch vor der die bei 8 ist ist, dann soll die 8 nacher vor der 4 stehen). Funktioniert leider nicht so ganz:
vorher:
0 16 44 67 94 107 121 142 164 183 200 230 248 272 290 309 328 344 359 385 415 42
9 446 470 492 509 533 554 587 600 615 635 663 685 710 732 752 771 804 824 868 90
5 937 971 984nacher:
31 29 19 16 16 9 40 27 39 21 10 24 24 24 23 23 23 21 25 41 23 23 23 38 34 34 34
30 29 35 35 35 40 40 40 40 40 44 44 41 41 41 44 44 43Hier mein Code, zuerst die Hilfsfunktion dann ein selection sort
ich ziehe praktisch den char an der Postion der zweiten phrasen von dem der ersten ab und wenn zweiterer im alphabet vorne liegt sollte ja eigentlich ein positver wert zurückgegeben werden weil der ascii kleiner isint vergleiche_n_woerter(int i, int j, vector <char> text) {
if (text[i]- text[j]==0) {
++i;
++j;
}
else {
return text[i] - text[j];
}}
void sortiere_phrasen(vector<int> & phrasen, vector<char> text) {
for (int i(0); i < phrasen.size() - 1; ++i) {
int k(i);
for (int j(i + 1); j < phrasen.size(); ++j) {
int ret(vergleiche_n_woerter(phrasen[k], phrasen[j], text));
if (ret > 0) {
k = j;
}
}
int x(i);
phrasen[i] = k;
phrasen[k] = x;
}
}Danke, falls irgendwer bis hier gelesen haben sollte
-
Die Funktion vergleiche_n_woerter ist blödsin:
- eine Funktion muss in jedem Fall einen Wert liefern, deine tut es nur im else
- i und j um 1 zu erhöhen hat keinerlei Auswirkungen im weiteren Programm (Stichwort call by value)
-
Hallo Xända,
Xända schrieb:
int vergleiche_n_woerter(int i, int j, vector <char> text) { if (text[i]- text[j]==0) { ++i; ++j; } else { return text[i] - text[j]; } } void sortiere_phrasen(vector<int> & phrasen, vector<char> text) { for (int i(0); i < phrasen.size() - 1; ++i) { int k(i); for (int j(i + 1); j < phrasen.size(); ++j) { int ret(vergleiche_n_woerter(phrasen[k], phrasen[j], text)); if (ret > 0) { k = j; } } int x(i); phrasen[i] = k; phrasen[k] = x; } }
Abgesehen davon, dass die Variablen
i
undj
invergleiche_n_woerter
keinerlei Wirkung haben, verwechselst Du insortiere_phrasen
den Index in den Vektor (i,k
) mit dem Inhalt des Vektors (phrasen[i]
). Es ist sinnlos diese einander zuzuweisen.Grob korrigiert, könnte Dein Code so aussehen:
bool vergleiche_n_woerter(int i, int j, vector<char> text) { return text[i] < text[j]; // true falls *i vor *j liegen soll } void sortiere_phrasen( vector<int> & phrasen, vector<char> text) { for (int i(0); i < phrasen.size() - 1; ++i) { for (int j(i + 1); j < phrasen.size(); ++j) { if( vergleiche_n_woerter( phrasen[j], phrasen[j-1], text ) ) { // Reihenfolge passt nicht auto tmp = phrasen[j]; // dann tausche phrasen[j-1] mit phrasen[j] phrasen[j] = phrasen[j-1]; phrasen[j-1] = tmp; } } } }
Noch besser wäre es, den Algorithmus
std::sort
zu nutzen. Du benötigst lediglich einen Funktor, der beim Vergleich von zwei Indizestrue
liefert, falls der erste vor dem zweiten liegen soll. Etwa so:sort( begin(phrasen), end(phrasen), [&text]( int p1, int p2 )->bool { return text[p1] < text[p2]; } );
Gruß
Werner
-
jawohl, funktioniert jetzt, danke Vielmals für eure hilfe