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 984

    nacher:
    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 43

    Hier 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 is

    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;
    }
    }

    Danke, falls irgendwer bis hier gelesen haben sollte 😛



  • Die Funktion vergleiche_n_woerter ist blödsin:

    1. eine Funktion muss in jedem Fall einen Wert liefern, deine tut es nur im else
    2. 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 und j in vergleiche_n_woerter keinerlei Wirkung haben, verwechselst Du in sortiere_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 Indizes true 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 😃


Log in to reply