Mittwoch, 23. November 2005

Martin der Sortierer

Jaja, ich hab gesagt, ich wollte heut nix mehr bloggen, aber trotzdem hat die Welt einfach ein R darauf, zu erfahren, was ich für ein toller Kerl mit riesengroßem Gehirn bin.

Weil: Martin hat ein bisschen Informatik gelernt und zwar Sortieralgorithmen, namentlich Bubble-, Insertion- und Selectionsort. Die ersten beiden hatten wir schon in der Vorlesung besprochen und weil ich immer noch ein bisschen unmotiviert bin, hab ich da einfach die Struktogramme, die der Fabian gemalt hat, in Kot umgewandelt.
Beim Selectionsort (der übrigens in-place, aber instabil arbeitet) haben wir aber nix Konkretes besprochen, deswegen musste ich mir da wohl oder übel selbst Gedanken zu machen. Hab dann auch 2 tolle Hilfsfunktionen geschrieben, hatte aber keinen Plan, wie ich die einbauen sollte. Deswegen hab ich erstmal ne halbe Stunde Pause gemacht, in der ich dieses hirnrissige Video gefunden habe.
Nach der Pause zwang ich mich dazu, weiterzumachen und siehe da, nach ca. 10 min Trial & Error hatte ich die Lösung™, die auf den ersten Blick total banane ist und die sich nur ein toller Kerl mit riesengroßem Gehirn hätte ausdenken können.

Natürlich fragt sich jetzt jeder, wie die Lösung™ nun aussieht und deswegen möchte ich auch dieses Geheimnis nun lüften: (Die Stelle, wegen der ich mich selber beneide, habe ich selbstverständlich hervorgehoben.)

#include <stdio.h>

void ausgabe(int *, int);
void tausche(int *, int, int);
int min(int *, int);

void main(void) {
      int a[] = {5, 7, 1, 6, 4, 3, 8, 2};
      int laenge = sizeof(a)/sizeof(int);
      int i;

      printf("Vorher:\n");
      ausgabe(a, laenge);

      for (i = 0; i < laenge-1; i++) {
            tausche(a, i, min(a+i, laenge-i)+i);
      }

      printf("Nachher: \n");
      ausgabe(a, laenge);
}

void ausgabe(int *a, int laenge) {
      int i;
      for (i = 0; i < laenge; i++)
            printf("%d ", a[i]);
      putchar('\n');
}

/* min liefert den Index zurück, an dem das kleinste Element steht */
int min(int *a, int laenge) {
      int i, min = 0;

      for (i = 1; i < laenge; i++) {
            if (a[i] < a[min]) {
                  min = i;
            }
      }

      return min;
}

void tausche(int *a, int ind1, int ind2) {
      int hilf = a[ind1];
      a[ind1] = a[ind2];
      a[ind2] = hilf;
}


Genial!

Gerade läuft: Nix

5 Kommentar/e:

Anonym hat gesagt…

wenn Du sagst, dass das genial ist, dann glaube ich es Dir einfach mal :D

Anonym hat gesagt…

und welche kotsprache ist das?

Anonym hat gesagt…

Ach na klar, wenn das so ist!
Wäre ich von selbst nie drauf gekommen!!!

Anonym hat gesagt…

Ich habs dir ja gleich gesagt!

Martin hat gesagt…

@frägü: Ist natürlich die kotigste Kotsprache überhaupt - C! Umso stolzer bin ich auf mich selbst ;)

Kommentar veröffentlichen