WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Sortier-Algorithmus inkorrekt?

 

major95
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 17.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2014, 19:03     Titel: Sortier-Algorithmus inkorrekt?
  Antworten mit Zitat      
Hallo user!

Ich muss einen Sortier-Algorithmus schreiben (bin ein Anfänger) aber meiner ist fehlerhaft. Er soll eine Spalte einer 10x4-Matrix durchllaufen und diese Spalte von klein nach groß sortieren. Mein Ansatz war eine forschleife und eine whileschleife, aber es funktioniert nicht. Der größte Wert der spalte soll gesucht und mit dem letzten wert der spalte umgetauscht werden. beim nächsten durchgang soll der letzte wert weggelassen werden usw. Kann mir bitte jemand weiterhelfen? danke! Smile

Hier ist der Code:
Code:


i=1
groesst=A(i,3)

for z=10:1
   
 
while i>=z
   if A(i,3)>groesst
       groesst=A(i,3)
   end
   i=i+1
end
i=zeile

hilf=A(10,3);
A(10,3)=A(zeile,3);
A(zeile,3)=hilf;

end



 
Private Nachricht senden Benutzer-Profile anzeigen


markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 03.06.2014, 20:53     Titel: Re: Sortier-Algorithmus inkorrekt?
  Antworten mit Zitat      
major95 hat Folgendes geschrieben:
Hallo user!

Ich muss einen Sortier-Algorithmus schreiben (bin ein Anfänger) aber meiner ist fehlerhaft. Er soll eine Spalte einer 10x4-Matrix durchllaufen und diese Spalte von klein nach groß sortieren. Mein Ansatz war eine forschleife und eine whileschleife, aber es funktioniert nicht. Der größte Wert der spalte soll gesucht und mit dem letzten wert der spalte umgetauscht werden. beim nächsten durchgang soll der letzte wert weggelassen werden usw. Kann mir bitte jemand weiterhelfen? danke! Smile

Hier ist der Code:
Code:


i=1
groesst=A(i,3)

for z=10:1
   
 
while i>=z
   if A(i,3)>groesst
       groesst=A(i,3)
   end
   i=i+1
end
i=zeile

hilf=A(10,3);
A(10,3)=A(zeile,3);
A(zeile,3)=hilf;

end



 


Vorab "...aber ist fehlerhaft" ist keine Fehlermeldung Wink Du musst schon sagen was genau nicht funktioniert oder was passiert oder was nicht passiert etc.

Afaiu:
1. Deine while Schleife soll von i <= z laufen (kleiner gleich, nicht größer gleich)! Sonst startet deine While-Schleife mit deiner Anfangskondition (z=10, i=1) nicht: 1 >= 10

2. In deiner vorvor und vorletzte Zeilen in der For-Schleife sind die indizes hardcodiert. hilf=A(z,3) und A(z,3)=A(zeile,3). Andernfalls würdest du immer nur den letzten Wert (10) deiner Matrix irgendwo hin tauschen.

3. Als letztes in der For-Schleife musst du dein i wieder auf 1 resetten, sonst läuft deine While-Schleife in der nächsten For-Runde nicht mehr an.


Wenn dann alles funktioniert, könntest du dir auch noch quicksort anschauen. https://de.wikipedia.org/wiki/Quicksort
Ein relativ einfach zum implementierender und schneller Sortier-Algorithmus.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
major95
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 17.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.06.2014, 21:23     Titel: Re: Sortier-Algorithmus inkorrekt?
  Antworten mit Zitat      
markuman hat Folgendes geschrieben:
major95 hat Folgendes geschrieben:
Hallo user!

Ich muss einen Sortier-Algorithmus schreiben (bin ein Anfänger) aber meiner ist fehlerhaft. Er soll eine Spalte einer 10x4-Matrix durchllaufen und diese Spalte von klein nach groß sortieren. Mein Ansatz war eine forschleife und eine whileschleife, aber es funktioniert nicht. Der größte Wert der spalte soll gesucht und mit dem letzten wert der spalte umgetauscht werden. beim nächsten durchgang soll der letzte wert weggelassen werden usw. Kann mir bitte jemand weiterhelfen? danke! Smile

Hier ist der Code:
Code:


i=1
groesst=A(i,3)

for z=10:1
   
 
while i>=z
   if A(i,3)>groesst
       groesst=A(i,3)
   end
   i=i+1
end
i=zeile

hilf=A(10,3);
A(10,3)=A(zeile,3);
A(zeile,3)=hilf;

end



 


Vorab "...aber ist fehlerhaft" ist keine Fehlermeldung Wink Du musst schon sagen was genau nicht funktioniert oder was passiert oder was nicht passiert etc.

Afaiu:
1. Deine while Schleife soll von i <= z laufen (kleiner gleich, nicht größer gleich)! Sonst startet deine While-Schleife mit deiner Anfangskondition (z=10, i=1) nicht: 1 >= 10

2. In deiner vorvor und vorletzte Zeilen in der For-Schleife sind die indizes hardcodiert. hilf=A(z,3) und A(z,3)=A(zeile,3). Andernfalls würdest du immer nur den letzten Wert (10) deiner Matrix irgendwo hin tauschen.

3. Als letztes in der For-Schleife musst du dein i wieder auf 1 resetten, sonst läuft deine While-Schleife in der nächsten For-Runde nicht mehr an.


Wenn dann alles funktioniert, könntest du dir auch noch quicksort anschauen. https://de.wikipedia.org/wiki/Quicksort
Ein relativ einfach zum implementierender und schneller Sortier-Algorithmus.





Also erstmal danke für die hilfe!
Ich hab das umgeändert was du gesagt hast, aber es funktioniert trotzdem nicht. Es gibt keine Fehlermeldung, aber die Spalte der Matrix verändert sich kein bisschen. Diese fixen indizes sind so gewollt, denn es soll der letzte Wert (zeile 10) der Spalte 3 mit der größten Zahl (groesst) umgetauscht werden. Ich hab meinen Code so umgeändert:

Code:


i=1
groesst=A(i,3)
for z=10:1
   
 
while i<=z
   if A(i,3)>groesst
       groesst=A(i,3)
   end
   i=i+1
end
i=zeile

hilf=A(10,3);
A(10,3)=A(zeile,3);
A(zeile,3)=hilf;

i=1
end

 


Wie gesagt, ändert sich an der Matrix A garnichts. Ich komm nicht darauf wieso sich nicht mal die zahlen etwas ändern..
Private Nachricht senden Benutzer-Profile anzeigen
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 03.06.2014, 22:46     Titel: Re: Sortier-Algorithmus inkorrekt?
  Antworten mit Zitat      
major95 hat Folgendes geschrieben:

Also erstmal danke für die hilfe!
Ich hab das umgeändert was du gesagt hast, aber es funktioniert trotzdem nicht. Es gibt keine Fehlermeldung, aber die Spalte der Matrix verändert sich kein bisschen. Diese fixen indizes sind so gewollt, denn es soll der letzte Wert (zeile 10) der Spalte 3 mit der größten Zahl (groesst) umgetauscht werden.

Ja, das wird ja auch gemacht, in der ersten For-Schleife für z=10. Im nächsten Durchgang z=9 steht ja der größte Wert bereits in der letzten Zeile und du willst den zweitgrößten Wert in die vorletzte Zeile schreiben. Änderst du den index 10 nicht, wird der zweitgrößte Wert in die letzte Zeile geschrieben.

Code:

for z=10:-1:1
    groesst=A(z,3);
    for i=1:z
        if A(i,3)>=groesst
            groesst=A(i,3);
            zeile=i;
        end
    end
sprintf('Tausche zeile %d mit  zeile %d', zeile, z)
hilf=A(z,3);
A(z,3)=A(zeile,3);
A(zeile,3)=hilf;
end
 


Ok, sind noch ein paar weitere Schnitzer und Logikfehler...Für z=10:1 muss die Schrittweite von -1 angeben werden, weil for sonst hochzählt und dann war es das. Von 10:1 käme als nächstes 11, aber 1 wurde damit schon lange erreicht.
Die größte (temporäre) Zahl ermittel ich direkt als erstes innerhalb der Schleifen - immer der letzte Wert. Kann auch der erste sein. Ist sowas von egal, da du ja eh alle noch folgenden Zahlen mit dieser Zahl vergleichst.
Dann habe ich die zweite Schleife auch in eine For-Schleife umgewandelt (ist übersichtlicher und greifbarer). Außerdem muss die if-Abfrage größer gleich sein, sonst kann es sein, dass bei einem Schleifendurchgang kein neuer großer Wert aus dem Mittelfeld gefunden wird und ans Ende verschoben wird. Für die gefundene große Zahl speicher ich auch direkt den Index Wert, das darf auch nicht nach der inneren Schleife passieren, weil sonst tauscht du Zeile 8 mit 8 z.b.

Code:

octave:15> A
A =

                     4                     6                     5
                     5                     4                     3
                    10                     2                     6
                     2                     8                     1
                     6                     2                    10
                     2                     2                     6
                     7                    10                     4
                     2                    10                     9
                     9                     6                     6
                    10                     7                     9

octave:16> sortieren
ans = Tausche zeile 5 mit  zeile 10
ans = Tausche zeile 8 mit  zeile 9
ans = Tausche zeile 5 mit  zeile 8
ans = Tausche zeile 6 mit  zeile 7
ans = Tausche zeile 5 mit  zeile 6
ans = Tausche zeile 3 mit  zeile 5
ans = Tausche zeile 1 mit  zeile 4
ans = Tausche zeile 3 mit  zeile 3
ans = Tausche zeile 2 mit  zeile 2
ans = Tausche zeile 1 mit  zeile 1
octave:17> A
A =

                     4                     6                     1
                     5                     4                     3
                    10                     2                     4
                     2                     8                     5
                     6                     2                     6
                     2                     2                     6
                     7                    10                     6
                     2                    10                     9
                     9                     6                     9
                    10                     7                    10

octave:88>
 

_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.