c++ wörter sortieren -bubblesort

aircoolguy

Cadet 3rd Year
Registriert
Apr. 2007
Beiträge
43
also ich will mit bubblesort wörter sortieren
das sortieren von zahlen rennt schon ::evillol:
Code:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>


void bubblesort(int v[], int n) {

  for (int i = n - 1; i > 0; i--) {

    
    for (int j = 0; j < i; j++) {

      
      if (v[j] > v[j + 1]) {

      
        int swp = v[j];
        v[j] = v[j + 1];
        v[j + 1] = swp;
}
}
}
}

int main() {
  int values[] = {10, 9, 56, 235, 4, 8, 28, 11, 8 , 7, 6, 5, 4, 3, 2, 1, };
  int count = sizeof(values) / sizeof(*values);

  
  //for (int i = 0; i < count; i++) printf("%5d", values[i]);
 // printf("\n");

  
  bubblesort(values, count);

  
  for (int i = 0; i < count; i++) printf("%5d", values[i]);
  printf("\n");

  system("PAUSE");
  return(0);
  getchar();
}

wie kann ich nun wörter sortieren ( ascii code auslesen?-aber wie?)

thx
aircoolguy
 
Tip: jedem Char kann eine Zahl zugeordnet werden. Also wäre 'a'+1='b'.

Du musst also den String in seine Bestandteile zerlegen und dann Schritt für Schritt untereinander vergleichen. Abzufangen wäre Groß und Kleinschreibung und unterschiedliche Wortlängen ;)
 
Ich würde zuerst dein Bubblesort erstmal richtig machen.
Ich weiß zwar nicht wie das bei C++ ist aber eigentlich sollte die Methode nicht mit einem "Void" belegt sein, wenn sie aufgerufen werden soll und dann den Wert zurückgeben soll.
Code:
int bubblesort(int v[], int n) {
boolean vertauscht;
int swp;

do {
	vertauscht = false;
	for (int i = 0; i < n-1; i++) {
		if (v[i] > v[i + 1]) {
        		swp = v[i];
			v[i] = v[i + 1];
        		v[i + 1] = swp;
			vertauscht = true;
		}
	}
        n--;
} while vertauscht;
return v[];
}
Und in einer Schleife werden nie Variablen deklariert. C++ hat auch keinen Garbage Collector ;)
Was den weiteren Verlauf antrifft, schließe ich mich Götterwind an.
 
Zuletzt bearbeitet:
Nutze einfach anstatt dem "<" Operator die strcmp funktion, die gibt dir 1,0,-1 zurück, je nach dem ob die Wörter größer , kleiner , gleich sind . ( Der ascii wert der bachstaben wird betrachtet )

Wenns viele Wörter werden, hier auf jeden Fall Bubble Sort durch Merge Sort \ Heap Sort, oder ähnliche n*log(n) Sortierungsalgortihmen erstzen.
 
@Götterwind
also wenn die beiden wörter "abzocke" und "fehler" währen dann müsste ich a+1=b und a+2=c vergleichen oder wie?
@ DragonIce das versteh ich nicht - aber hauptsache meins funktioniert optiemieren kann man ja immer noch

wie ihr seht ist mein problem die idee in code zu stecken d.h. vielleicht könntet ihr mal ein beispiel machen - wär sehr nett

danke!

airc00lguy
 
DragonIce schrieb:
Und in einer Schleife werden nie Variablen deklariert. C++ hat auch keinen Garbage Collector ;)
Schwachsinn!!! Du kannst natürlich deine Variablen in der Schleife deklarieren und dank heutiger Compiler wird der erzeugte Binärcode genau so aussehen, wie wenn die Variable vorher deklariert worden wäre. Außerdem wird diese Variable mit einer hohen Wahrscheinlichkeit nie im Arbeitsspeicher landen, sondern in den Prozessorregistern verweilen.

EDIT: Und am einfachsten gehts wirklich mit der strcmp Funktion. Falls du nicht zwischen Groß-/Kleinschreibung unterscheiden möchtest, dann gibt es noch die stricmp Funktion.
 
@ aircoolguy -- Was verstehst du nicht?

@ Simpson474 -- Nein kein Schwachsinn. Selbstverständlich kann man es machen aber es ist absolut sinnbefreit weil sie jedes mal neu initialisiert wird. Das kostet unnötig Zeit und Ressourcen.
Außerdem hat das auch was mit einem sauberen Programmierstil zu tun
 
Zuletzt bearbeitet:
es ist mir egal ob es lange dauert und recurcen frisst -hauptsache es kann mir ein par wörter ordenen

strcmp hört sich gut an - wie kann ich das ganze aber nun bei mir einbauen? Und wie gehe ich mit den zahlen die mir das ding zurückgibt um?

achja auf klein/gross sc***e ich
 
Falls du die Variable
Code:
int swp = ...
meinst, dann kostet keinerlei Zeit und Ressourcen. Außerdem finde ich es so den Code übersichtlicher, als wenn man die Variable am Anfang deklariert.

EDIT:

Mit der Zeile
Code:
if (v[j] > v[j + 1])
vergleichst du ja im Moment zwei Zahlen miteinander. Wenn jetzt das Array v Strings (Zeichenketten) enthält, dann ersetzt du die Zeile einfach durch
Code:
if(strcmp(v[j], v[j + 1] > 0))
 
Zuletzt bearbeitet:
Bei dem was ich dir geschrieben habe, wird das gesamte Array{ v[] } sortiert(Sofern du das mit dem "strcmp " einfügst) zurückgegeben und du kannst damit alles anstellen. Kannst es ausgeben usw.

@ Simspon474 -- Dann wird die Variable aber immer noch nicht in der Schleife deklariert sondern davor
Code:
...
	[COLOR="Red"][B]int swp;	[/B][/COLOR]
for (int i = 0; i < n-1; i++) {

        if (v[i] > v[i + 1]) {
        ...
        }
 ....
}
...
 
Zuletzt bearbeitet:
Die Variable wird in der Schleife deklariert, genau wie im ersten Post von aircoolguy.
Außerdem ist dein zurückgegebenes Array kompletter Schwachsinn, da sowieso das Array, das als Parameter übergeben wird sortiert wird. Ruft er also seine Funktion auf
Code:
bubblesort(v, 10);
dann ist nach dem Funktionsaufruf das Array v sortiert, auch ohne Rückgabe.
 
Welches er aber nicht im Rahmen der main-Funktion sortiert benutzen kann...
Deswegen ist es auch nur ein Parameter und keine für die Klasse gültige Variable ;)
Ansonsten wäre das return ja der größte Humbug seid es Programmierung gibt.
 
Er kann es natürlich in der main verwenden. Ich empfehle dir erst einmal ein C-Buch (am besten nicht C++ für den Anfang) zumindest bis zu den Zeigern zu lesen. Dann weißt du auch was seine Funktion macht.

Und wenn du es so willst, der return ist der größte Humbug seit es Programmierung gibt :D.
Es gibt natürlich auch Einsatzzwecke das ist ein return mehr geeignet als die Übergabe durch call by reference, aber in diesem Fall sicher nicht.
 
ich hab jezt wie simpsons 474 sagte die zeilen vertauscht das bringt aber nur einen error muss ich dafür noch etwas includen?
 
Dein Funktionsheader sollte jetzt in etwa so aussehen:
Code:
void bubblesort(char *v[], int n) {

außerdem wirst du wahrscheinlich noch
Code:
#include <string.h>

brauchen.
 
Zurück
Oben