Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Sortieren von Zeichenketten (Array) [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




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]);
}

 
h3ll
01-05-2010, 19:27 
 
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... :)

 
h3ll
01-05-2010, 19:48 
 
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:

 
h3ll
01-05-2010, 19:54 
 
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;
}
}

 
Kropff
01-05-2010, 20:30 
 
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*


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:16 Uhr.