Eigener Sortieralgorythmus
-
Auszug aus Wikipedia
Der Algorithmus sieht im Pseudocode so aus:
prozedur bubbleSort( A : Liste sortierbarer Elemente ) definiert als:
n := Länge( A ) - 1
wiederhole
vertauscht := falsch
für jedes i in 0 bis n wiederhole:
falls A[ i ] > A[ i + 1 ] dann
vertausche( A[ i ], A[ i + 1 ] )
vertauscht := wahr
falls ende
für ende
n := n - 1
während vertauscht
prozedur endeich kann damit nicht wirklich viel anfangen ich brauch mal jemand der mir c++ komplet erklärt besonders die umsetzung insbesodere Felder also arees und schleifen

-
http://tutorial.schornboeck.net/hello_world.htm
hier ein TutorialEdit: Schleifen: http://tutorial.schornboeck.net/schleifen.htm
Arrays: http://tutorial.schornboeck.net/arrays.htm
-
Naja ich geb dir nochmal die Funktion ... ist allerdings in diesem Fall ne Template-Func ... also setz stattdessen einfach den entsprechenden Typ ein falls dein Compiler damit nicht klar kommt
...template <typename T> void bubble_sort(T*& arr, const std::size_t& size) { bool redo = false; do { redo = false; for (std::size_t i = 0; (i < (size - 1) && arr[i] != NULL && arr[i+1] != NULL); ++i) if (arr[i] > arr[i + 1]) { std::swap<T>(arr[i], arr[i + 1]); redo = true; } } while (redo == true); }...
-
großes Dankeschön
ich werd mich mal dransetzen und morgen hochladen
-
Hmm ich erklär ihn dir mal sicherheitshalber

template <typename T> void bubble_sort(T*& arr, const std::size_t& size) // also übergeben wird eine Referenz eines Zeigers auf einen Array vom Type T ... die Größe des Arrays (Anzahl Elemente) gibt size an. { bool redo = false; // Speichert ob wir nochmal durchlaufen müssen. do { redo = false; // Setzt am Anfang jedes Laufes redo wieder auf false zurück, da wir sonnst eine Endlosschleife hätten. for (std::size_t i = 0; i < (size - 1); ++i) // wir gehen alle Elemente des Arrays durch ... if (arr[i] > arr[i + 1]) // wenn das Element größer ist als das folgende Element ... { std::swap<T>(arr[i], arr[i + 1]); // ... müssen wir die einmal austauschen ... => arr[i] = arr[i+1] && arr[i + 1] = arr[i] redo = true; // Es war noch nicht alles richtig sortiert also müssen wir nochmal durchlaufen ... } } while (redo == true); // erst aufhören wenn in der ganzen for-Schleife nie die Bedingung der if-Abfrage wahr war. }
-
Ein einfacher Algo wäre Insertion Sort: (im Pseudocode)
Zahl key, Indizes i,j Feld A für j=2,...,n{ key=A[j]; i=j-1; solange i>0 und A[i]>key { A[i+1]=A[i]; i=i-1; } A[i+1]=key; }Dabei werden immer die direkten Nachbarn verglichen und das Vergleichselement ggf. nach links verschoben.
Bsp.:
A[1] A[2] A[3] A[4] A[5] A[6] 5 <-> 2 4 6 1 3 2 5 <-> 4 6 1 3 2 4 5 >6< 1 3 2 -> 4 -> 5 -> 6 -> 1 3 |-------------------------- | 1 2 4 -> 5 -> 6 -> 3 |---------------------| 1 2 3 4 5 6
-
Ich habs fast fertig aber irgendwo ist noch ein fehler!!!
void __fastcall TForm1::Button2Click(TObject Sender)
{
ListBox1->Clear();
int zahlenfeld = new int[11];
zahlenfeld[1] = StrToInt(Form1->Edit1->Text);
zahlenfeld[2] = StrToInt(Form1->Edit2->Text);
zahlenfeld[3] = StrToInt(Form1->Edit3->Text);
zahlenfeld[4] = StrToInt(Form1->Edit4->Text);
zahlenfeld[5] = StrToInt(Form1->Edit5->Text);
zahlenfeld[6] = StrToInt(Form1->Edit6->Text);
zahlenfeld[7] = StrToInt(Form1->Edit7->Text);
zahlenfeld[8] = StrToInt(Form1->Edit8->Text);
zahlenfeld[9] = StrToInt(Form1->Edit9->Text);
zahlenfeld[10] = StrToInt(Form1->Edit10->Text);
}template <typename y>
void eigener_sortieralgorithmus(y*& zahlenfeld, const std::size_t& size)
{
bool redo = false;
do {
redo = false;
for (std::size_t i = 0; i < (size - 1); ++i)
if (zahlenfeld[i] > zahlenfeld[i + 1])
{
std::swap<y>(zahlenfeld[i], zahlenfeld[i + 1]);
redo = true;
}
} while (redo == true); }{
ListBox1->Items->Add(IntToStr(zahlenfeld [i]));
}//---------------------------------------------------------------------------
C++ Fehler Deklarationn nicht ordnungsgemäß abgeschlossen

-
was ist eigentlich ein template??????
-
Aicde schrieb:
Ich habs fast fertig aber irgendwo ist noch ein fehler!!!
void __fastcall TForm1::Button2Click(TObject *Sender) { ListBox1->Clear(); int* zahlenfeld = new int[11]; zahlenfeld[1] = StrToInt(Form1->Edit1->Text); zahlenfeld[2] = StrToInt(Form1->Edit2->Text); zahlenfeld[3] = StrToInt(Form1->Edit3->Text); zahlenfeld[4] = StrToInt(Form1->Edit4->Text); zahlenfeld[5] = StrToInt(Form1->Edit5->Text); zahlenfeld[6] = StrToInt(Form1->Edit6->Text); zahlenfeld[7] = StrToInt(Form1->Edit7->Text); zahlenfeld[8] = StrToInt(Form1->Edit8->Text); zahlenfeld[9] = StrToInt(Form1->Edit9->Text); zahlenfeld[10] = StrToInt(Form1->Edit10->Text); } template <typename y> void eigener_sortieralgorithmus(y*& zahlenfeld, const std::size_t& size) { bool redo = false; do { redo = false; for (std::size_t i = 0; i < (size - 1); ++i) if (zahlenfeld[i] > zahlenfeld[i + 1]) { std::swap<y>(zahlenfeld[i], zahlenfeld[i + 1]); redo = true; } } while (redo == true); } { ListBox1->Items->Add(IntToStr(zahlenfeld [i])); } //---------------------------------------------------------------------------Nulltens: sfds
Erstens: Steht der letzte Abschnitt wirklich so einsam in deiner Datei? Wenn ja, da fehlt der Funktionskopf zu diesem Rumpf.
Zweitens: Wo rufst du die Sortierfunktion denn auf? Und mit welchen Parametern? (in der OnButton-Methode werden die Zahlen ab Index 1 eingetragen, die Sortierfunktion beginnt mit Index 0 zu sortieren)
Drittens: Warum selber schreiben? std::sort() ist doch schon verfügbar.
-
zu Drittens: weil Hausaufgabe
zu Erstens: ja!! also muss da noch Ausgabe hin oder so was ähnliches
zu zweitens: also muss zwischen zeile 16-17 irgend ein aufruf????
-
Aicde schrieb:
zu Erstens: ja!! also muss da noch Ausgabe hin oder so was ähnliches
Ich weiß ja nicht, was du vorhast, aber auf jeden Fall muß dieser Code-Abschnitt in einer Funktion landen (eventuell sogar ans Ende der Button2Click()).
zu zweitens: also muss zwischen zeile 16-17 irgend ein aufruf????
Zwischen die Zeilen nicht (das wäre ja wieder außerhalb einer Funktion ;)), aber hinter Zeile 14 solltest du schon die Sortierfunktion aufrufen.
PS: Ein Template ist eine Art Schablone für viele verschiedene Funktionen. Das heißt, anstatt je eine Sortierfunktion für int's, double's, string's oder hundekuchen zu schreiben, schreibst du eine Schablone für beliebige Typen (der Bezeichner 'y' ist übrigens etwas unüblich) und lässt dir vom Compiler genau die Variante(n) erzeugen, die du brauchst.
-
Ich hatte das bei allen meinen programmen unten stehen z.B. bei der ausgabe von Pirmzahlen
[quote="CStoll"]
Aicde schrieb:
zu Erstens: ja!! also muss da noch Ausgabe hin oder so was ähnliches
Ich weiß ja nicht, was du vorhast, aber auf jeden Fall muß dieser Code-Abschnitt in einer Funktion landen (eventuell sogar ans Ende der Button2Click()).
deswegen weis ich auch nicht wie ich den fehler beheben soll
ich möchte die 10 sortierten zahlen in eine listbox ausgeben lassen
-
das wäre ja wieder außerhalb einer Funktion ;)), aber hinter Zeile 14 solltest du schon die Sortierfunktion aufrufen.
wie muss ich das den schreiben IntToStr= ???
-
void __fastcall TForm1::Button2Click(TObject Sender)
{
ListBox1->Clear();
int zahlenfeld = new int[11];
zahlenfeld[1] = StrToInt(Form1->Edit1->Text);
zahlenfeld[2] = StrToInt(Form1->Edit2->Text);
zahlenfeld[3] = StrToInt(Form1->Edit3->Text);
zahlenfeld[4] = StrToInt(Form1->Edit4->Text);
zahlenfeld[5] = StrToInt(Form1->Edit5->Text);
zahlenfeld[6] = StrToInt(Form1->Edit6->Text);
zahlenfeld[7] = StrToInt(Form1->Edit7->Text);zahlenfeld[8] = StrToInt(Form1->Edit8->Text);
zahlenfeld[9] = StrToInt(Form1->Edit9->Text);
zahlenfeld[10] = StrToInt(Form1->Edit10->Text);
}template <typename y>
void eigener_sortieralgorithmus(y*& zahlenfeld, const std::size_t& size)
{
bool redo = false;
do {
redo = false;
for (std::size_t i = 0; i < (size - 1); ++i)
if (zahlenfeld[i] > zahlenfeld[i + 1])
{
std::swap<y>(zahlenfeld[i], zahlenfeld[i + 1]);
redo = true;
}
} while (redo == true); }
while (redo == true); //muss das den so aussehen? nur dann bekomme ich zwei fehler
{
ListBox1->Items->Add(IntToStr(zahlenfeld [i]));
}//---------------------------------------------------------------------------
-
Das ist immer noch freischwebend. Besser ist es so:
void __fastcall TForm1::Button2Click(TObject *Sender) { ListBox1->Clear(); int* zahlenfeld = new int[10];//du kannst Element 0 ruhig verwenden zahlenfeld[0] = StrToInt(Form1->Edit1->Text); zahlenfeld[1] = StrToInt(Form1->Edit2->Text); zahlenfeld[2] = StrToInt(Form1->Edit3->Text); zahlenfeld[3] = StrToInt(Form1->Edit4->Text); zahlenfeld[4] = StrToInt(Form1->Edit5->Text); zahlenfeld[5] = StrToInt(Form1->Edit6->Text); zahlenfeld[6] = StrToInt(Form1->Edit7->Text); zahlenfeld[7] = StrToInt(Form1->Edit8->Text); zahlenfeld[8] = StrToInt(Form1->Edit9->Text); zahlenfeld[9] = StrToInt(Form1->Edit10->Text); eigener_sortieralgorithmus(zahlenfeld,10);//Aufruf der Sortierfunktion for(int i=0;i<10;++i) { ListBox1->Items->Add(IntToStr(zahlenfeld [i])); } }PS: Zum zweiten Mal - sfds
-
Hallo
Nein damit erzeugst du eine leere Schleife die entweder nichts macht oder endlos ist. Das Semikolon hinter dem while muß weg damit der nachfolgende Codeblock als zu der Schleife gehörend erkannt wird.
/Edit : ach nö, ich bin einfach noch nicht wieder fit

bis bald
akari
-
und danach dann den rest drann hängen ?????
void __fastcall TForm1::Button2Click(TObject Sender)
{
ListBox1->Clear();
int zahlenfeld = new int[10];//du kannst Element 0 ruhig verwenden
zahlenfeld[0] = StrToInt(Form1->Edit1->Text);
zahlenfeld[1] = StrToInt(Form1->Edit2->Text);
zahlenfeld[2] = StrToInt(Form1->Edit3->Text);
zahlenfeld[3] = StrToInt(Form1->Edit4->Text);
zahlenfeld[4] = StrToInt(Form1->Edit5->Text);
zahlenfeld[5] = StrToInt(Form1->Edit6->Text);
zahlenfeld[6] = StrToInt(Form1->Edit7->Text);
zahlenfeld[7] = StrToInt(Form1->Edit8->Text);
zahlenfeld[8] = StrToInt(Form1->Edit9->Text);
zahlenfeld[9] = StrToInt(Form1->Edit10->Text);eigener_sortieralgorithmus(zahlenfeld,10);//Aufruf der Sortierfunktion
for(int i=0;i<10;++i)
{
ListBox1->Items->Add(IntToStr(zahlenfeld [i]));
}
}also so?

template <typename y>
void eigener_sortieralgorithmus(y*& zahlenfeld, const std::size_t& size)
{
bool redo = false;
do {
redo = false;
for (std::size_t i = 0; i < (size - 1); ++i)
if (zahlenfeld[i] > zahlenfeld[i + 1])
{
std::swap<y>(zahlenfeld[i], zahlenfeld[i + 1]);
redo = true;
}
} while (redo == true); }
-
Ja, genau - wenn du lustig bist, kannst du die beiden Funktionen auch vertauschen

PS: Und wenn du noch weitere Hilfe von mir erwartest, formatier deine Quelltexte in Zukunft übersichtlicher - ich hab dich nicht umsonst schon mehrfach auf sfds hingewiesen.
akari schrieb:
/Edit : ach nö, ich bin einfach noch nicht wieder fit

Ich überlass dir gerne das Feld

-
Ich bekomm immernoch den c++Fehler E2268 Aufruf der undefinierten Funktion eigener_sortieralgorithmus.
Was muss ich da machen???void __fastcall TForm1::Button2Click(TObject *Sender) { ListBox1->Clear(); int* zahlenfeld = new int[10];//du kannst Element 0 ruhig verwenden zahlenfeld[0] = StrToInt(Form1->Edit1->Text); zahlenfeld[1] = StrToInt(Form1->Edit2->Text); zahlenfeld[2] = StrToInt(Form1->Edit3->Text); zahlenfeld[3] = StrToInt(Form1->Edit4->Text); zahlenfeld[4] = StrToInt(Form1->Edit5->Text); zahlenfeld[5] = StrToInt(Form1->Edit6->Text); zahlenfeld[6] = StrToInt(Form1->Edit7->Text); zahlenfeld[7] = StrToInt(Form1->Edit8->Text); zahlenfeld[8] = StrToInt(Form1->Edit9->Text); zahlenfeld[9] = StrToInt(Form1->Edit10->Text); eigener_sortieralgorithmus(zahlenfeld,10);//Aufruf der Sortierfunktion for(int i=0;i<10;++i) { ListBox1->Items->Add(IntToStr(zahlenfeld [10])); } } also so? :arrow_right: template <typename y> void eigener_sortieralgorithmus(y*& zahlenfeld, const std::size_t& size) { bool redo = false; do { redo = false; for (std::size_t i = 0; i < (size - 1); ++i) if (zahlenfeld[i] > zahlenfeld[i + 1]) { std::swap<y>(zahlenfeld[i], zahlenfeld[i + 1]); redo = true; } } while (redo == true); }erbitte Hilfe hab auch deinen rat angenommen^^
-
Hallo
Du rufst die Funktion auf bevor du sie definierst. Verschieb entweder die Funktion eigener_sortieralgorithmus vor die Methode TForm1::Button2Click oder mach eine Forward Declaration oder lagere eigener_sortieralgorithmus in eine eigene Headerdatei aus die du oben in der cpp-Datei includest in der sie gebraucht wird.
bis bald
akari