Laden...

Insertionsort mit Array (keine abbruchbedingung oda endlosschleife :( )

Erstellt von Heckenschere vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.483 Views
H
Heckenschere Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren
Insertionsort mit Array (keine abbruchbedingung oda endlosschleife :( )

Also ich bins mal wieder mit den lustigen Algorithmen 🙂
nachdem ich Selectionsort fertig hab, hab ich mich ma an Insertionsort versucht.
Ich glaub es ist alles richtig was ich habe , aber irgendwie gibt der mir nix aus und ich glaub entweder hab ich ne endlosschleife gebaut und mir fehlt nur noch ne abbruchbedingung
Hier is der Quellcode:


static void Main(string[] args)
        {
int j,key,i;
            int[] a = new int[] { 83, 26, 9, 44, 29, 46, 32, 83, 18, 76 };

            for (j = 2; j < a.Length; j++)
            {
                do
                {
                    key = a[j];
                    i = j - 1;
                }
                while (i > 0 && a[i] > key);
                a[i + 1] = a[i];
                i = i - 1;
                a[i + 1] = key;
            } Console.WriteLine(a[j]);
        }

343 Beiträge seit 2007
vor 16 Jahren

Sag mal Heckenschere kennst du wikipedia? 😁
Irgendwie hat der Pseudocode dort verblüffende Ähnlichkeiten mit deinem.
(Falls das nur zufällig so ist, dann schau trotzdem mal auf wikipedia)
Dort steht nämlich zwischen dem Pseudocode noch ein Kommentar:
//Füge A[j] ein in die sortierte Folge A[1 .. j  1].

Vielleicht hilft dir dieser Tipp ja weiter.

//edit: naja, eigentlich ein Schwachsinn, was ich da oben grad geschrieben habe. Sagen wirs mal so: du hast den Pseudocode etwas missverstanden (ich gehe jetzt mal davon aus, dass du dich bei wikipedia schlau gemacht hast, wenn nicht, verzeih mir bitte diese Annahme). Genauer gesagt passen die Anfänge und Enden der Schleifen nicht so ganz.

//edit (2): okay ich machs noch etwas einfacher. So sollte es dann zum Schluss aussehen:

        static void Main(string[] args)
        {
            int j, key, i;
            int[] a = new int[] { 83, 26, 9, 44, 29, 46, 32, 83, 18, 76 };

            for (j = 1; j < a.Length; j++)  //j = 1
            {
                key = a[j];
                i = j - 1;
                while ((i >= 0) && (a[i] > key)) { // >=
                    a[i + 1] = a[i];
                    i = i - 1;
                }
                a[i + 1] = key;
            }

            for(int z=0; z<a.Length; z++)
                Console.WriteLine(a[z]);
            Console.ReadKey();
        }

Hier funktioniert die Ausgabe nun nicht mehr so wie bei Selectionsort. Hier muss zuerst fertig sortiert werden, dann kann erst die Ausgabe erfolgen!
Soweit ich das sehe fängt das Array beim Pseudocode auf wikipedia bei 1 an und nicht bei 0 so wie in C#.

Mfg Preli

[- www.saftware.net -](http://www.saftware.net/)
H
Heckenschere Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

ehrlich gesagt hast mich erwischt 🙂
hab den aber nach dem struktorgramm abgearbeitet weil ich die verfahren noch nich wirklich verstehe.
und diesen satz füge ... ein hab ich auch übersehen 🙂
aber verstehen tu ich den auch nich
entweder bin ich ziemlich dumm oda ich sehs einfach nich....

mfG
Hecke

343 Beiträge seit 2007
vor 16 Jahren

Original von Heckenschere
ehrlich gesagt hast mich erwischt 🙂

Nun, wikipedia ist keine Schande. Irgendwoher muss man sich ja seine Infos holen.
Ich kann da nur sagen, wer noch nie auf wikipedia war, der werfe den ersten Stein. 😁

Mfg Preli

PS: ich werd schon mal anfangen mich für Quick und Selectionsort vorzubereiten. 😉

[- www.saftware.net -](http://www.saftware.net/)
5.742 Beiträge seit 2007
vor 16 Jahren

Hallo Heckenschere,

bitte verwende in Zukunft Codetags

H
Heckenschere Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

hmm irgendwie muss ich schmunzeln 😁
is echt nich normal also ich hab jetzt meine fehler gefunden und hab wieder deine schleife da dran gehängt nur jetzt gibt er mir wieder nix aus 😁
ich dreh langsam am rad


        static void Main(string[] args)
        {
            int j,key,i;
            int[] a = new int[] { 83, 26, 9, 44, 29, 46, 32, 83, 18, 76 };

            for (j = 1; j < a.Length; j++)
            {
                do
                {
                    key = a[j];
                    i = j - 1;
                }
                while (i >= 0 && a[i] > key); // <--- muss da immer noch nen semi hin machen -.-
                {
                a[i + 1] = a[i];
                i = i - 1;
                }
                a[i + 1] = key;
            } 
            for(int z=0; z<a.Length; z++)
                Console.WriteLine(a[z]);
            Console.ReadKey();
        }

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Heckenschere,

while (i >= 0 && a[i] > key); // <--- muss da immer noch nen semi hin machen -.-  

was aber bedeutet, dass du eine leere Schleife hast und i nicht verändert wird, denn der folgenden Code


{
   a[i + 1] = a[i];
   i = i - 1;
}

wird nicht mehr innerhalb der Schleife ausgeführt. Das Semikolon ist also an der Stelle sehr ungesund.

herbivore

343 Beiträge seit 2007
vor 16 Jahren

So ist es, das Problem liegt an deinem "semi"

muss da immer noch nen semi hin machen -.-

Vielleicht hilft dir das zu verstehen warum: Eine while schleife führt immer die die danach folgende Anweisung aus. Mit einem { } auch mehrere. In deinem Fall hast du (wieder mal) eine tolle Endlosschleife, weil die Schleife eines macht nämlich nichts -> " ;"

Mfg Preli

[- www.saftware.net -](http://www.saftware.net/)
H
Heckenschere Themenstarter:in
10 Beiträge seit 2007
vor 16 Jahren

ok danke für die info ich werde versuchen das Semikolon zu beseitigen.
is aber nich einfach aber ich meld mich noch ma wenn ich den fehler finde weil ohne semi funzt es auch nich 😁

mfG
Hecke

//edit : hmm.... ich kann ändern was ich will der will immer das semikolon wieder haben.

//edit2: HIHI habs endlich geschafft. Musste das dumme do weg machen. aber ich versteh irgendwie nich warum bei wiki da do steht und es mit do garnich funzt komisch komisch aber ich habs jetzt 🙂

danke noch ma für eure hilfe 👍 👍 👍 👍 👍

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Heckenschere,

vorsorglich: [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

herbivore

343 Beiträge seit 2007
vor 16 Jahren

Original von Heckenschere
edit2: HIHI habs endlich geschafft. Musste das dumme do weg machen. aber ich versteh irgendwie nich warum bei wiki da do steht und es mit do garnich funzt

Das liegt daran, dass bei wikipedia pseudocode steht und nicht C#-Code

Mfg Preli

[- www.saftware.net -](http://www.saftware.net/)