# alphabetisch sortieren



## Winner (21. September 2007)

Hallo zusammen! Ich habe da mal foldendes Problem und würde gerne meine daten so sortieern das sie alphabetisch geordnet sind! Leider habe ich eine Funktion geschrieben, die nicht ganz den Zweck erfüllt! Könnt ihr mir da weiter helfen und mir sagen wo der Fehler liegt


```
void XML::sortierenEinfuegen(std::string array[],int anzElm){

	int i,j,k; //Indizes (k wird dafür verwendet um den entsprechenden Datensatz zu lesen)
		int x,y; //aktuller Wert
		
		for(i=1;i<anzElm;i++){  //Über die aktuelllen Werte laufen

			std::string aktuellerString; //Variable für den aktuellen Wert
			x=(int)array[i].data(); //Zuweisung aktuelles Element
			aktuellerString.insert(0,array[i].data());
						
			//Elemente verschieben bis Einfügetslle gefunden
			for(k=i+1;k<=anzElm;k++){  //Schleife um den Wert aktuell+1 zu ermitteln
				y=(int)array[k].data();

				//Vergleichen und ggf. austauschen
				for(j=i-1;(j!=0)&&(x<y);j--){ 
					printf("\nin der schleife");
					array[j+1]=array[j];
					array[j]=aktuellerString.data();
				}//ende j
				
				break; //Schleife abbrechen, wenn in der innern Vorschleife nichts gefunden wurde

			}//ende k
				
		}//ende for i

}//ende sortierenEinfuege
```

Also er sortiert ds nicht richtig! Ich wandel vorher alles in den ascii code um wieso klappt es dann nicht, wenn ich das ganze vergleiche


----------



## Endurion (21. September 2007)

Cool, du nimmst data() (ein Pointer auf den alloziierten Datenblock), castest ihn auf int und vergleichst die. Du sortierst quasi nach den Adressen des std::string-interneten Speicherblocks.

Du kannst die std::strings einfach direkt vergleichen, die haben Operatoren eingebaut.

Du kannst es dir aber auch ganz einfach machen, und ein std::multiset oder std::set nehmen, da alle Strings reinpacken und schon sind sie automatisch sortiert.


----------



## Winner (21. September 2007)

Dann werd ich gleich mal deinen zweiten tip ausporbiern! Anscheind kann das ja garkein großes problem sein und nur wenig code oder! Aber sind diese daann alpabetisch sortiert


----------



## Winner (21. September 2007)

Tut mir leid! Aber damit komm ich auch nicht weiter!

Klappt einfach nicht! Kannst du mir vielleicht doch weiter helfen und mir ein stück posten damit es klappt! Denn es geht einfach nicht


----------



## Endurion (21. September 2007)

Mal sehen, ob ich's aus dem Kopf hinkriege:


```
void XML::sortierenEinfuegen(std::string array[],int anzElm)
{
  std::multiset<std::string>   setSort;

  // in das Set schieben
  for ( int i = 0; i < anzElm; ++i )
  {
    setSort.insert( array[i] );
  }

  // der Reihe nach wieder auslesen und in das Array schreiben
  int iCurIndex = 0;
  std::multiset<std::string>::iterator  it( setSort.begin() );
  while ( it != setSort.end() )
  {
    array[iCurIndex] = *it;
    
    ++it;
    ++iCurIndex;
  }
}
```

Wenn du sowieso mit C++ programmierst, könntest du auch ganz gut einen std::vector<std::string> statt dem Array verwenden.

Ein bißchen Hintergrund:

Ein (Multi-)Set ist ein Container, der seine Objekte sortiert enthält. Zum Sortieren wird der == und < Operator verwendet (meine ich, könnte auch <= sein).
D.h. nach dem Einsetzen liegen die im Set bereits alphabetisch sortiert vor. Das mit dem Iterator geht jetzt einfach alle der Reihe nach durch und schreibt sie wieder ins Array.

Der Unterschied zwischen Set und MultiSet: In einem Set kann ein Objekt nur einmal vorkommen, bei einem MultiSet darf es mehrfach vorkommen.


----------



## Winner (24. September 2007)

Prima besten dank! Hat geklappt!


----------

