Sortieralgorithmus für Visual Basic .NET o.ä. gesucht

Gast #2014483
Lesenswert?

Hallo.

Ich habe eine Liste als Array, z.B.

[Arrayposition]. [Wert]
1. 1
2. 3
3. 5
4. 2
5. 4
6. 10
7. 8
8. 9
9. 7
10. 6

Ich habe nun eine Reihe von Definitionen/Bedingungen
6 > 3
4 > 2, 3 und 1
8 > 6 und 7

Wie kann ein Sortieralgorithmus aussehen, der das Array nach diesen 
Definitionen sortiert(aber nicht mehr, so kann 5 durchaus nach der 8 
kommen)?

Und mich auf Widersprüche hinweist.

PS: Zahlen als Wertigkeit, in Wahrheit sind es Wörter. Das heißt also 
bspw.
"Wort1, Wort2 und Wort6 müssen immer vor Wort3 auftauchen" und "Wort8 
muß vor Wort6 auftauchen"
Das kann dann zu

Wort1
Wort2
Wort8
Wort6
Wort3

oder zu

Wort1
Wort8
Wort2
Wort6
Wort3

oder zu

Wort2
Wort8
Wort1
Wort6
Wort3

usw.

führen, nicht aber bspw. zu

Wort2
Wort3
Wort1
Wort6
Wort8

Bei Rückfragen, diese stellen.
Gast #2014521
Lesenswert?

Im Prinzip kannst du einen der gängigen Sortieralgorithmen benutzen. Die 
Vergleichsfunktion muss halt angepasst werden. Ich würde das über ein 
Dictionary lösen. In dem Dictionary würden dann die Definitionen stehen. 
Jede Definition sieht folgendermaßen aus: Zahl1, Zahl2, Relation.
Die Vergleichsfunktion kriegt zwei Zahlen und guckt im Dictionary, 
welche größer ist. Ist kein passender Eintrag vorhanden, wird einfach 
die erste Zahl als größere gewertet.
Gast #2014529
Lesenswert?

Loki schrieb:
> Im Prinzip kannst du einen der gängigen Sortieralgorithmen benutzen. Die
> Vergleichsfunktion muss halt angepasst werden. Ich würde das über ein
> Dictionary lösen. In dem Dictionary würden dann die Definitionen stehen.
> Jede Definition sieht folgendermaßen aus: Zahl1, Zahl2, Relation.
> Die Vergleichsfunktion kriegt zwei Zahlen und guckt im Dictionary,
> welche größer ist. Ist kein passender Eintrag vorhanden, wird einfach
> die erste Zahl als größere gewertet.

Ich verstehe nicht, wie das aussehen kann. Bitte ein simples Beispiel.
Gast #2014819
Lesenswert?

Ich bezieh mich mal auf das "o.ä." im Thread-Titel und geb ein 
Perl-Beispiel:
1
%Reihenfolge=(
2
  Wort1=>4,
3
  Wort2=>2,
4
  Wort3=>3,
5
  Wort4=>1,
6
  Nochwas=>5
7
);
8
@ZuSortieren=qw(
9
  Wort1
10
  Wort2
11
  Wort3
12
  Wort4
13
);
14
@Sortiert=sort { $Reihenfolge{$a} <=> $Reihenfolge{$b} } @ZuSortieren;
15
print join(', ',@Sortiert),"\n";

Sowas in der Art war gesucht, oder?
#2014849
Lesenswert?

Nostrifizius in der Satrapenwirtschaft schrieb:
> Ich verstehe nicht, wie das aussehen kann. Bitte ein simples Beispiel.

Statt eines einzigen Dictionaries würde ich hier eher eine Matrix bzw. 
ein Dictionary aus Dictionaries nehmen (ist die Reihenfolge von Anfang 
an eindeutig, geht's natürlich auch mit nur einem einfachen 
Dictionary/Array/Liste etc.).
1
{ { Wort1 < Wort1?, Wort1 < Wort2?, Wort1 < Wort3,? Wort1 < Wort4? },
2
   { Wort2 < Wort1?, Wort2 < Wort2?, Wort2 < Woer3?, Wort2 < Wort4? },
3
   { Wort3 < ... },
4
   ...
5
}
6
konkret dann bspw.
7
{ { false, true, true, false },
8
   { false, false, true, false },
9
   { true, true, false, false },
10
   { true, false, false, false } }

umgesetzt werden könnte das dann bspw. in C# (sollte sich aber 
problemlos in VB umschreiben lassen) so oder wie von DirectX angedeutet, 
mit einer Sprache, die so etwas besser kann.
1
        var ListToSort = new List<string>() { "Wort1", "Wort2", "Wort3", "Wort4" };
2
        var Matrix = new Dictionary<string, Dictionary<string, bool>>();
3

4
        public int WordComparison(string x, string y) {
5
            Dictionary<string, bool> lu;
6
            bool val;            
7
            if (Matrix.TryGetValue(x, out lu)) {
8
                if (lu.TryGetValue(y, out val)) {                
9
                    ...   
10
                }
11
            }
12
            return ...;
13
        }
14

15
            ListToSort.AddRange(new string[] { "Wort1", "Wort2", "Wort3", "Wort4" });
16

17
            Matrix.Add("Wort1", new Dictionary<string, bool>());
18
            Matrix.Add("Wort2", new Dictionary<string, bool>());
19
            Matrix.Add("Wort3", new Dictionary<string, bool>());
20
            Matrix.Add("Wort4", new Dictionary<string, bool>());
21
            Matrix["Wort1"].Add("Wort1", false);
22
            Matrix["Wort1"].Add("Wort2", true);
23
            Matrix["Wort1"].Add("Wort3", true);
24
            Matrix["Wort1"].Add("Wort4", false);
25

26
            ListToSort.Sort(WordComparison);

Unstimmigkeiten kann man mit passendem Iterieren über die einzelnen 
Dictionaries herausfinden.

spess53 schrieb:
> Hi
>
> Hat Visual Basic keine Listenelemente? Mit Delphi würde ich ein TList
> nehmen. 'Sorted' auf True und fertig.
>
> MfG Spess

Gibt's schon, nur gehe ich davon aus, dass das nicht reicht.
Gast #2014921
Lesenswert?

Ich habe folgendes geschrieben - Bubblesort:

Dim vTemp As String
For j = Inhalt.Count - 1 To 0 Step -1
  For i = 0 To j
    If i < Inhalt.Count - 1 Then
      If Vergleich(Inhalt(i).ToString, Inhalt(i + 1).ToString) Then
        vTemp = Inhalt(i).ToString
        MsgBox("Drin")
        Inhalt(i) = Inhalt(i + 1)
        Inhalt(i + 1) = vTemp
      End If
    End If
  Next i
Next j

Vergleich-Funktion gibt True aus, wenn Inhalt(i) größer ist, also nach 
Inhalt(i + 1) stehen soll.

Leider wird die Fkt so gut wie nie aufgerufen. Inhalt ist ein ArrayList.

Verwende ich stattdessen das Original von 
http://msdn.microsoft.com/de-de/library/bb979305.aspx

Dim vTemp As String
For j = Inhalt.Count - 1 To 0 Step -1
  For i = 0 To j
      If Vergleich(Inhalt(i).ToString, Inhalt(i + 1).ToString) Then
        vTemp = Inhalt(i).ToString
        MsgBox("Drinf")
        Inhalt(i) = Inhalt(i + 1)
        Inhalt(i + 1) = vTemp
      End If
  Next i
Next j

wird angezeigt, daß außerhalb des Index operiert werden würde. Bei 10 
Elementen, 0 -> 9 gibt es bei 9 den Indexfehler.

Warum funktioniert das Original nicht und meine veränderte Fkt wird so 
gut wie nie aufgerufen.

Es kann jetzt leicht sein, daß ich unabsichtlich Informationen 
unterschlage. Bei Verständnisschw. fragen.
Gast #2014944
Lesenswert?

... schrieb:
> Wenn man schon fremden Code benutzt sollte man ihn entweder verstehen
> oder wenigstens korrekt abtippen.
> Tip: "Inhalt.Count" vs. "UBound(ArrayToSort)"

Da liegst du falsch. Warum muß ich dir nicht begründen.
Gast #2014966
Lesenswert?

Hmm, versucht da jemand sich wieder die Hausübung machen zu lassen und 
wird sofort unfreundlich wenn man ihn nicht direkt mit der Nase auf 
seine Fehler stösst.
Ist schon interessant, erst erzählt er etwas von Sortieralgorithmen und 
spezifischen Regeln für die Sortierung und präsentiert dann einen 
fehlerhaften Bubblesort...
Gast #2014976
Lesenswert?

U.R. Schmitt schrieb:
> Hmm, versucht da jemand sich wieder die Hausübung machen zu lassen und
> wird sofort unfreundlich wenn man ihn nicht direkt mit der Nase auf
> seine Fehler stösst.
> Ist schon interessant, erst erzählt er etwas von Sortieralgorithmen und
> spezifischen Regeln für die Sortierung und präsentiert dann einen
> fehlerhaften Bubblesort...

Viel interessanter ist, daß du das Problem gar nicht erst lösen kannst 
aber dennoch schreibst um jeden zu zeigen, daß du es nicht kannst.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.