Archiv verlassen und diese Seite im Standarddesign anzeigen : Sortieren von Zeichenketten (Array)
Jessy_87 01-05-2010, 19:25 Hallo ihr lieben,
ich versuche schon seit Stunden mein kleines Script fertig zu bekommen, aber scheitere am richtigen Einsatz der for-schleife :(
die Zeichenketten sind in a[i] gespeichert (i steht für die anzahl der zk, kleine zählvariable). die zeichenketten sollen lexikografisch sortiert werden.
der pseudocode sieht bisher folgerndermaßen aus:
for(j=0; j <= i-1; j++) {
strcmp(a[erstes element], a[nächstes element]);
}aber wie spreche ich in der schleife immer das erste element und das folgende des arrays an, vergleiche die beiden und tausche gegebenfalls?
also bei
j=0 --> a[0] und a[1];
j=1 --> a[1] und a[2];
hier mal nen kleines beispiel, was rauskommen sollte:
Eingabe: --> wird zu:
aab aaa
aaa aab
adc adc
czw czw
würde mich über ne kleine hilfestellung sehr freuen
edit: mir fällt grad ein, das folgende variante laufen sollte:
for(j=0; j <= i-1; j++) {
strcmp(a[0+j], a[1+j]);
}
PHP: sort - Manual (http://de.php.net/manual/en/function.sort.php)
Jessy_87 01-05-2010, 19:34 das problem ist dabei, dass ich nicht in php schreibe, sondern in C, sich aber die grundlegende Syntax nicht unterscheidet... :)
das problem ist dabei, dass ich nicht in php schreibe, sondern in C
Dann bist du hier im Forum wohl ein wenig falsch.
Jessy_87 01-05-2010, 19:51 naja im c-forum ist recht wenig los und wie schon gesagt, die syntax ist letztlich die gleiche ;)
also wie würde es ohne die sort()-fkt gehen? :beer:
naja im c-forum ist recht wenig los und wie schon gesagt, die syntax ist letztlich die gleiche ;)
also wie würde es ohne die sort()-fkt gehen? :beer:
Du kannst dir ja den Source-Code von sort() anschauen. PHP ist auch nur in C programmiert.
Jessy_87 01-05-2010, 20:03 ehm....:mad:
rein theoretisch müsste der folgende code mit einer hilfsvariablen doch richtig sein, oder?
for (j=0; j<=i-1; j++) {
if (strcmp(a[0+j], a[1+j]) == 1) { // zweites element ist größer als erstes
char tmp = a[0+j];
a[0+j] = a[1+j];
a[1+j] = tmp;
}
}
Also wenn es hier um C geht, ist das definitiv das falsche Forum. Daher * verschieb *
Peter
fireweasel 01-05-2010, 21:06 C selbst hat keine eingebaute Sortierfunktion. Aber die Standard-Library hat eine. Der übergibst du einen Zeiger auf deine Vergleichsfunktion. Insofern ist die Vorgehensweise tatsächlich so ähnlich (aber nicht gleich) wie in PHP.
Mit einer For-Schleife bekommst du jedenfalls in beiden nichts sortiert. Mit zwei verschachtelten schon. Dieses Verfahren nennt sich Bubblesort (http://en.wikipedia.org/wiki/Bubble_sort#Alternative_implementations). ;)
Jessy_87 01-05-2010, 21:24 habe es mittlerweile raus...
und ja ich hab zwei verschaltelte for-schleifen ;)
fireweasel 01-05-2010, 22:15 habe es mittlerweile raus...
und ja ich hab zwei verschaltelte for-schleifen ;)
Quellcode oder nie passiert.
Mit nur einer for-Schleife kann man ein C-Array nicht sortieren. Und strcmp() eignet sich nicht zur lexikographischen Sortierung -- es vergleicht "ASCII-betisch".
Jessy_87 01-05-2010, 22:36 ok, das versteh ich nicht so recht
bei mir funktioniert es einwandfrei...
void sortieren(){
for (k=0; k < i-1; k++) {
for (j=0; j<i-1; j++) {
if (strcmp(a[j], a[j+1]) == 1) {
char *tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}
davon abgesehen, dass bubble-sort echt nen blöder algorithmus ist (laufzeit)...
fireweasel 02-05-2010, 19:30 ...
bei mir funktioniert es einwandfrei...
Erlaubst du mir, dies zu bezweifeln? ;)
void sortieren(){
for (k=0; k < i-1; k++) {
for (j=0; j<i-1; j++) {
if (strcmp(a[j], a[j+1]) == 1) {
char *tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}
Meine C-Kenntnisse sind nicht sehr gut, aber irgendwas sagt mir, dass das Aus-dem-Hut-Zaubern bspw. der Variablen a einen ordentlich konfigurierten Compiler dazu veranlassen dürfte, mindestens eine Warnung auszuspucken. Das Gleiche gilt für "k < i - 1" ohne vorherige Deklaration und Initialisierung von i. Und strcmp() (http://linux.die.net/man/3/strcmp) liefert bei Ungleichheit durchaus auch andere Werte als nur 1.
Da ich keine Lust auf Warnungen und Fehlermeldungen eines C-Compilers hatte, hab ich das mal in PHP nachgebaut:
function sortieren($a) {
for ($k = 0; $k < $i - 1; $k++) {
for ($j = 0; $j < $i - 1; $j++) {
if (strcmp($a[$j], $a[j+1]) === 1) {
$tmp = $a[$j];
$a[$j] = $a[$j + 1];
$a[j + 1] = $tmp;
}
}
}
return $a;
}
// dein Ausgangsarray
$a = preg_split('/\s+/', '
aab aaa
aaa aab
adc adc
czw czw
', -1, PREG_SPLIT_NO_EMPTY);
// die Funktion aufrufen
$x = sortieren($a);
//
var_dump($x);
Bei Ausführung dieses Scripts wird ein nicht initialisiertes $i bemäkelt.
Außerdem ist das Ergebnis-Array in der gleichen Reihenfolge sortiert, wie das Ausgangs-Array ...
Einwandfreies Funktionieren stelle ich mir etwas anders vor ... ;)
davon abgesehen, dass bubble-sort echt nen blöder algorithmus ist (laufzeit)...
Seine Laufzeit dürfte der deines Ansatzes gleich kommen -- zwei verschachtelte For-Schleifen über ein Array von Zeichenketten ...
Warum benutzt du nicht, wie von mir vorgeschlagen, die in der Standard-Lib eingebaute Sortierfunktion (http://linux.die.net/man/3/qsort)?
Jessy_87 02-05-2010, 19:53 alle benötigten variablen wurden vor der main()-fkt deklariert und initialisiert...
dein quellcode in php ist doch genau der gleiche wie auch meiner
nur die qsort-fkt sollte ich mir mal anschauen...
fireweasel 02-05-2010, 23:56 alle benötigten variablen wurden vor der main()-fkt deklariert und initialisiert...
Globale Variablen ...?
*wegrenn*
|
|