array sortieren

Einen wunderschönen guten Morgen,

Ich verstehe nicht ganz wie comp3 funktioniert, weil ich die Sternchen noch nicht kenne

Mit den Sternchen wird ein Zeiger auf einen Adressbereich im Speicher dereferenziert. D. h. (im Prinzip) du übergibst deiner Funktion eine Adresse im Speicher. Mit den Sternchen kannst du dann auf den Inhalt der Adresse zurückgreifen. Da du Zeiger noch nicht kennst, würde ich dir empfehlen, dich auf jeden Fall damit zu beschäftigen.

Code:
int comp_3(const void *v1, const void *v2) {
  int* a = (int*)v1;
  int* b = (int*)v2;
 
  if (a[0] != b[0]) return a[0] - b[0];
  else return a[1] - b[1];
}

Was ich verstehe ist, dass er erst nach Spalte 0 und danach nach Spalte 1 sortiert, woher er weiß was a und b sind bekomm ich aber nicht raus. Und wie mittels "a[0] - b[0]" sortiert wird auch nicht. Der Debugger ist mir da leider auch keine große Hilfe. Was natürlich auch wieder an mir liegen kann...

Die Funktion bildet die Differenz der Werte der ersten Spalte (falls diese ungleich sind). Ist diese Differenz negativ, so ist b[0] größer. Ist die Differenz positiv, ist a[0] größer. Die Differenz wird an die rufende Funktion (hier: qsort()) zurückgegeben. Dort kann dann, wie ich oben, entschieden werden, welches Datum kleiner (größer) ist, und an welche Position diese Datum kommen soll. Wenn a[0] und b[0] gleich groß sind, wird genauso mit a[1] und b[1] verfahren.

Die Funktion comp_3() gibt somit nur an, welches von zwei Daten kleiner (größer) ist.

Gruss
Mizi
 
Die Erklärung ist noch besser als, die die ich gefunden hatte
Super :)

Die Sache mit den Zeigern werde ich mir auf jeden Fall noch genaue angucken
 
Hallo nochmal :)

Das mit dem Sortieren der Reihenfolge nach klappt wunderbar, perfekt würde es, wenn es auch komplizierter ginge :D


Könnte man dieses vereifachte Beispielarray
Code:
0{0    0}
1{0    1}
2{13   2}
3{13   3}
4{5    4}
5{5    6}
6{18   8}
7{-1  13}
8{-1   5}

so sortieren, dass wenn in Spalte 1 eine 13 steht, die Reihe, bei der in Spalte 2 die 13 steht, hinter der letzten Reihe ist, die die 13 in Spalte 1 hat? Also Reihe 7 hinter Reihe 3, Reihe 8 hinter Reihe 5 usw.
Für insgesamt 100 Reihen....

Viele Grüße
Mareike
 
Einen wunderschönen guten Tag,

Ich komme mit deiner Beschreibung nicht ganz klar. Wie willst du nun sortieren? Kannst du ein vollständiges Beispiel machen. Wie sieht dein unsortiertes Array aus? Und wie soll es sortiert aussehen? Und dann: Beschreib das nochmal in mehreren Sätzen. Der eine Schachtelsatz ist nur sehr schwer verständlich.

Gruss
Mizi
 
Mahlzeit ;-]

ich vermute, er meint sowas in dieser Art:
Code:
0{0    0}
1{0    1}
2{13   2}
3{13   3}
7{-1  13} !!
4{5    4}
5{5    6}
8{-1   5} !!
6{18   8}

Also 7 hinter 3 und 8 hinter 5 (wegen einer Korrelation zw. 1. und zweiter Spalte) ....... :suspekt:

Also, ich denke, dafür wird man schon einen eigenen Algorithmus entwickeln müssen. Standardsortierungen sortieren immer mit einer gewissen Logik :)

Gruß
Klaus
 
Richtig vermutet :)
Algorithmus klingt kompliziert, ich glaube so wichtig ist es dann doch nicht :)

Aber die einfachen Dinge machen doch keinen Spaß ;-] :)

Aber ganz so schlimm ist es wohl nicht!
Wenn Dir die Sortierung nach Spalte prinzipiell reicht, dann lauf einfach anschließend durch die Struktur und setze die betroffenen Zeilen 'händisch' um. Wobei ich mich allerdings bspw. frage, was Du macht, wenn etwa in Zeile 2 Spalte 2 Dein Wert von Zeile 7 Spalte 1 (hier also '-1') auftaucht. Wird Zeile 2 dann auch wieder umsortiert? ? ?
Oder sind Deine Werte à prioiri so eindeutig ?

Gruß
Klaus
 
Aber die einfachen Dinge machen doch keinen Spaß ;-] :)

theoretisch ja, praktisch bin ich im Programmieren aber noch nicht wirklich bewandert ;)

Aber ganz so schlimm ist es wohl nicht!
Wenn Dir die Sortierung nach Spalte prinzipiell reicht, dann lauf einfach anschließend durch die Struktur und setze die betroffenen Zeilen 'händisch' um. Wobei ich mich allerdings bspw. frage, was Du macht, wenn etwa in Zeile 2 Spalte 2 Dein Wert von Zeile 7 Spalte 1 (hier also '-1') auftaucht. Wird Zeile 2 dann auch wieder umsortiert? ? ?
Oder sind Deine Werte à prioiri so eindeutig ?

Versteh ich jetzt nicht so ganz

Die Werte in Spalte 2 gehen von 0 bis 99 und kommen immer nur einmal vor
Die Werte in Spalte 1 weisen auf Spalte 2 und kommen 0 bis 8 mal vor

Wenn in Spalte 1 der Wert -1 steht dann ist der "Weg" quasi beendet, und das Sortieren kann neu beginnen mit dem nächsten Wert.

Lg
mimita
 
Hallo,

aha, jetzt wissen wir schon mal wieder mehr ;-]

Das bedeutet dann, ausgehend von Deinen Array
Code:
0{0    0}
1{0    1}
2{13   2}
3{13   3}
4{5    4}
5{5    6}
6{18   8}
7{-1  13}
8{-1   5}
dass die Zeile 7 aufgrund der 13 in Spalte 2 hinter das letzte Vorkommen der 13 irgendwo in Spalte 1 (hier also die Zeile 3) einsortiert werden soll, oder auch hinter Zeile 2 ?

Warum ist dieses Array denn nach der Zeilennummer und nicht nach Spalte 1 sortiert ? :confused:

Wenn in Spalte 1 der Wert -1 steht dann ist der "Weg" quasi beendet, und das Sortieren kann neu beginnen mit dem nächsten Wert.
Was bedeutet denn hier "nächster Wert" ? ? ?

Irgendwie verstehe ich die Bedeutung dieser Zeilen wohl auch nicht. Scheint mir alles etwas verquer zu sein! ! !

Vielleicht beschreibst Du mal, was das überhaupt für Zahlenpaare sind und warum sie 'seltsam' sortiert werden müssen!

Vielleicht gibt es da ja deutlich einfachere Ansätze (BTW: habe mir jetzt nicht nochmal alls bisherigen Posts intensiv durchgelesen!)

Gruß
Klaus
 
Ich versuch's mal :)

Zunächst worum es geht:

Ich habe ein 10x10 Grid, das eine Landschaft darstellt
Jede Zelle hat eine andere Höhe
Wenn es regnet, dann fließt Wasser von der höheren Zelle in die niedrigste der umliegenden 8

Die Richtung in die das Wasser fließt wird nicht mit Koordinaten angegeben, sondern als Absolutwert 0-99.
Ist eine Zelle flach, oder die niedrigste, dann fließt kein Wasser weg und sie bekommt den Wert -1.

Spalte 1 gibt also die Zellnummer an, in die das Wasser fließt, Spalte 2 sind die Zellnummern.

Momentan ist das Array nach einer dritten Spalte sortiert, die angibt wieviele der 8 umliegenden Zellen Wasser in die Zelle abgeben.

Zeile 7 soll nur hinter die allerletzte 13 in Spalte 1 rein.

Ich hoffe ich konnte mich halbwegs verständlich ausdrücken ;)
 

Neue Beiträge

Zurück