Forum: PC-Programmierung Was habe ich hier für eine Sortier algorithmus programmiert?


von Joachim M. (joachim_m582)


Lesenswert?

Moin Leude,
Ich muss gerade was für die Informatikklausur an der Uni programmieren 
und wollte einen Sortieralgorithmus programmieren. Leider weiß ich nicht 
welchen Typ dieser hier entspricht. Ist das ein selection sort 
algorithmus?

#include <stdio.h>

int main()
{
    int hilf1,hilf2,i,k;

   int array[10]={4,7,2,8,6,3,5,9,0,1};
   for(k=0;k<10;k++){
       for(i=0;i<10;i++){
           if(array[k]<array[i]){
            hilf1=array[k];
            hilf2=array[i];
            array[k]=hilf2;
            array[i]=hilf1;


   }} }
   int j;
   for(j=0;j<10;j++){
   printf("%i", array[j]);
   }
    return 0;
}

Vielen dank im vorraus!

von Georg A. (georga)


Lesenswert?

Joachim M. schrieb:
> und wollte einen Sortieralgorithmus programmieren.

So ohne irgendwelche Anforderungen? Sehr seltsam.

Joachim M. schrieb:
> Ist das ein selection sort algorithmus?

Kannst du das nicht er-wikipedia-en, ob dein Code auf die Beschreibung 
da passt?

von Joachim M. (joachim_m582)


Lesenswert?

Ich bin der Meinung es handelt sich um eine Art Bubblesort aber ich bin 
mir ja gerade nicht sicher trotz wikipedia.

von Schlaumaier (Gast)


Lesenswert?

Bubblesort braucht immer 2 Schleifen die ineinander verschachtelt sind 
und eine Puffer_variable für jedes Feld.

Bubblesort heißt deshalb so weil der Wert solange nach vorne gesetzt 
wird, wie er kleiner ist, als der Wert der vor ihm ist. Er steigt also 
auf wie eine Bubble (Blase).

Ergo ist dein Code ein Bubble-sort (wenn er funktioniert).

Bubblesort ist übrigens der sicherste Sortiercode aber auch der 
langsamste.

von Schlaumaier (Gast)


Lesenswert?

Schlaumaier schrieb:
> Bubblesort heißt deshalb so weil der Wert solange nach vorne gesetzt
> wird, wie er kleiner ist, als der Wert der vor ihm ist.

GRÖSSER natürlich.  Man ich sollte pennen gehen. 16 Std. am Stück am PC 
sind zu viel.

von mh (Gast)


Lesenswert?

Schlaumaier schrieb:
> Bubblesort ist übrigens der sicherste Sortiercode aber auch der
> langsamste.
Wie genau definierst du sicher?

von Kai S. (zigzeg)


Lesenswert?

Joachim M. schrieb:
> Ist das ein selection sort
> algorithmus?

Definitiv nicht. Dieser wuerde in jedem Schritt das kleinste Element aus 
den verbleibenden suchen, und dieses dann mit einer Vertauschung an den 
Anfang bringen, und dann auf den verbleibenden weiter machen.
Dies ist eher Bubble Sort ohne fruehzeitigen Abbruch wenn bereits alles 
sortiert ist.

ZigZeg

von Joachim M. (joachim_m582)


Lesenswert?

Vielen Dank an beide. War bisschen verunsichert, welcher das genau ist. 
Und ja er funktioniert. Das war ja das erste was mich überrascht hat. :D

von Joachim M. (joachim_m582)


Lesenswert?

Wie kann man einen geeigneten Abbruch den einfügen in dem Fall jetzt?

von Dirk B. (dirkb2)


Lesenswert?

Joachim M. schrieb:
> Wie kann man einen geeigneten Abbruch den einfügen in dem Fall jetzt?

Wenn nichts getauscht wurde - also der if-Zweig nicht ausgeführt wird.

von Joachim M. (joachim_m582)


Lesenswert?

#include <stdio.h>

int main()
{
    int hilf1,hilf2,i,k;

   int array[10]={14,17,12,18,6,13,5,19,0,1};
   for(k=0;k<10;k++){
       for(i=0;i<10;i++){
           if(array[k]>array[i]){
            hilf1=array[k];
            hilf2=array[i];
            array[k]=hilf2;
            array[i]=hilf1;
        }
        break;

   }}
   int j;
   for(j=0;j<10;j++){
   printf("%i ", array[j]);
   }
    return 0;
}


So hatte ich das jetzt verstanden. Das funktioniert aber nicht.

von Sebastian S. (amateur)


Lesenswert?

Muss das nicht heißen?
   for(k=0;k<9;k++){
       for(i=k+1;i<10;i++){...
usw.

von Joachim M. (joachim_m582)


Lesenswert?

Was genau würde das denn deiner Meinung nach bringen?
ALso ich binabsoluter anfänger:D

von Nils (Gast)


Lesenswert?

Schlaumaier schrieb:
> Bubblesort ist übrigens der sicherste Sortiercode aber auch der
> langsamste.

Korrekt. Wir wir alle wissen sind schnellere Algorithmen generell 
unsicher..

Slow seems save!

von MaWIn (Gast)


Lesenswert?

Irgendetwas zusammenbauen und nachher gucken, was es geworden ist.
Das kenne ich sonst nur vom Kochen und Backen.

von Heiner (Gast)


Lesenswert?

Joachim M. schrieb:
> Wie kann man einen geeigneten Abbruch den einfügen in dem Fall jetzt?

Warum willst du irgendwas abbrechen? Die unnötigen Vergleiche kannst du 
noch rausschmeißen: Nach n Durchläufen der äußeren Schleife sind die 
ersten n Elemente bereits an der korrekten Position. Wie man die innere 
Schleife verbiegen muss, damit das nicht immer wieder von vorne 
überprüft wird, findest du selbst raus. Es steht ansonsten auch in jeder 
Implementierung.

Außerdem ist der Tausch mit zwei Hilfsvariablen unnötig, eine tut's 
auch. Eigentlich ergibt sich das alles, wenn du eine beliebige 
Bubblesort-Implementierung anschaust.

Schlaumaier schrieb:
> Bubblesort ist übrigens der sicherste Sortiercode aber auch der
> langsamste.

Wuff. Normalen Menschen würde das Gehirn explodieren, wenn sie so einen 
Unfug schreiben würden, aber bei dir scheint da keine Gefahr zu 
bestehen.

von Joachim M. (joachim_m582)


Lesenswert?

Deswegen werde ich wahrscheinlich auch kein Informatiker...
Das mit der Abbruchbedingung hab ich aber immer  noch richtig verstanden 
wie man die hier einbringen kann.

von ChaosNaxus (Gast)


Lesenswert?

... und Jazz

von Dirk B. (dirkb2)


Lesenswert?

Joachim M. schrieb:
> So hatte ich das jetzt verstanden. Das funktioniert aber nicht.

Wenn der if-Zweig in der inneren Schleife nicht mehr ausgeführt wird.
Einmal reicht nicht.
Du musst dir merken, ob er ausgeführt wurde - ja, da brauchst du eine 
zusätzliche Variable.

von Joachim M. (joachim_m582)


Lesenswert?

#include <stdio.h>

int main()
{
    int hilf1,hilf2,i,k;

   int 
array[20]={14,17,12,18,6,13,5,19,0,1,56,77,88,99,22,34,56,76,11,119};
   for(k=0;k<20;k++){
       for(i=k;i<20;i++){
           if(array[k]>array[i]){
            hilf1=array[k];
            array[k]=array[i];
            array[i]=hilf1;
        }
   }
   }
   int j;
   for(j=0;j<20;j++){
   printf("%i ", array[j]);
   }
    return 0;
}

Habe ich das so ganz gut umgesetzt oder gibt es da noch immer Punkte die 
den Code sehr ineffizient machen?
Danke für die Hilfe!

von Heiner (Gast)


Lesenswert?

Joachim M. schrieb:
> Das mit der Abbruchbedingung hab ich aber immer  noch richtig verstanden
> wie man die hier einbringen kann.

Lies den Wikipedia-Artikel. Für das Ergebnis ist das hier aber 
irrelevant und der asymptotische Aufwand ändert sich auch nicht, nur die 
Best-Case-Laufzeit.

Bei Fragen der Art "Wie funktioniert Algorithmus X und wie implementiert 
man das?" ist der Cormen im Studium dein Freund, vielleicht auch noch 
darüber hinaus.

von PittyJ (Gast)


Lesenswert?

In meiner Jugend gab es noch Bücher. Das Standardwerk dazu war 
"Algorithmen und Datenstrukturen" von einem gewissen Niklaus Wirth. (Der 
hat dann auch noch die Sprachen Pascal und Modula (und weitere) 
entwickelt.)
In dem Buch sind auf 50 Seiten (77-145) die verschiedenen 
Sortieralgorithmen gegenüber gestellt.

Vielleicht findet sich ja noch ein Exemplar in einer Uni-Bibliothek, 
oder einem Antiquariat.
Mir hat es damals sehr geholfen.

von Udo S. (urschmitt)


Lesenswert?

Zeig mir doch mal einer einen Bubble-sort wo so mit den beiden 
Schleifenindices getauscht wird:

   for(k=0;k<10;k++){
       for(i=0;i<10;i++){
         if(array[k]<array[i]){
            hilf1=array[k];
            hilf2=array[i];
            array[k]=hilf2;
            array[i]=hilf1;


Das ist nie und nimmer ein Bubble Sort. Ob dieses Konstrukt wirklich 
funktioniert oder nur zufällig bei den gewählten Zahlen habe ich mir 
nicht mehr genauer angeschaut.

von Meister Lampenzwirn (Gast)


Lesenswert?

Nimm eine gequirlte Zahlenmenge, stelle sie graphisch in excel dar, 
sortiere, das Ergebnis wieder graphisch darstellen. Ist das so 
schwierig?

Dann kannst die deine Sortierverfahren nach Qualität bewerten.

von db8fs (Gast)


Lesenswert?

Joachim M. schrieb:
> Was genau würde das denn deiner Meinung nach bringen?
> ALso ich binabsoluter anfänger:D

Er spart Vergleiche auf 0<0 bzw 10<10 damit ein.

von Schlaumaier (Gast)


Lesenswert?

mh schrieb:
> Wie genau definierst du sicher?

Einfach und schnell zu schreiben. Geht mit wenigen Zeilen Code.

Sicher = Weniger Code = Weniger potenzielle Fehlerquellen.

Ich kann ihn (als einzigen) schon seit 20 Jahren auswendig.

Ich hatte mal einen anderen probiert der war ca. 40% schneller aber hat 
mich 2 Tage gekostet ihn anzupassen.

Und was auch das Sicher macht. Schonmal mit array-Sort bei VB 
gearbeitet. Das ist so schrottig das es sogar die Hilfe zugibt.

Bei den Bubblesort muss man nur darauf achten das bei Texten die selbe 
Codepage + die selbe Buchstabengröße benutzt wird.  Deshalb empfehle ich 
immer ein Vergleich mit LCASE - Funktion(alles in Kleinbuchstaben), wenn 
nix anders explizit gefordert wird.

Fast alle Programmiersprachen sehe da nämlich ein Unterschied weil die 
Sortierreihenfolge nach der geltenden ASCII-Tabelle 
(Locations-Einstellungen) durchgeführt wird.

Ist aber nur wichtig wenn man kein AMI ist. ;) ÄÖÜ sind nämlich öfters 
mal woanders, in der Tabelle.

Joachim M. schrieb:
> Wie kann man einen geeigneten Abbruch den einfügen in dem Fall jetzt?

Mit einen EXIT-FOR oder in den man (unelegant aber geht) den 
Schleifenwert über die den Max-wert der Schleife stellt.

von Joachim M. (joachim_m582)


Lesenswert?

Also ich habe keine Ahnung vom Programmieren @Udo aber das sortieren 
funktionier für verschiedene Zahlen und auch Anzahlen an Zahlen habe ich 
variiert. Dafür dass mir gesagt wurde dass es ja so leicht mit dem 
Wikipediaartikel wäre passen die Meinungen hier aber nicht ganz.
Aber @Udo du kannst den Code gerne ausprobieren und mir dann sagen 
welchen Sortiertyp das entspricht. Das war ja meine ursprüngliche frage.

von Karatona (Gast)


Lesenswert?

bubble sort

von Sebastian S. (amateur)


Lesenswert?

for(k=0;k<20;k++){
       for(i=k;i<20;i++){

Vergleicht als erstes [0] mit [0] ist nicht übermäßig sinnvoll.

Beim zweiten Durchlauf von k ist der erste Vergleich [1] ? [1]

Bei den folgenden Durchläufen sieht es gleich aus.

Der letzte Durchlauf vergleicht [19] mit [19] ist auch nicht der 
Bringer.

Deshalb mein Vorschlag:
   for(k=0;k<19;k++){
       for(i=k+1;i<20;i++){

siehe auch mein Tip von 16:43

muss aber nicht sein;-)

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Joachim M. schrieb:
> Leider weiß ich nicht welchen Typ dieser hier entspricht.

schau mal hier, da kannst du nachsehen ob deiner mit dabei ist.

https://www.youtube.com/results?search_query=sortieralgorithmen+tanz

: Bearbeitet durch User
von Hp M. (nachtmix)


Lesenswert?

Schlaumaier schrieb:
> Bubblesort heißt deshalb so weil der Wert solange nach vorne gesetzt
> wird, wie er kleiner ist, als der Wert der vor ihm ist. Er steigt also
> auf wie eine Bubble (Blase).

Auf alten Maschinen mit ihren bescheidenen Taktfrequenzen konnte man das 
sogar schön sehen, wenn man Textzeilen auf dem Bildschirm sortiert hat.
Vielleicht geht das auch heute noch, wenn man mal einen Bubblesort für 
den Makro-Interpreter der Textverarbeitung schreibt.

Schlaumaier schrieb:
> Bubblesort ist übrigens der sicherste Sortiercode aber auch der
> langsamste.

Langsam ist er, aber "sicher" ist das falsche Attribut. Das Gegenteil 
wäre "unsicher", und das kann eigentlich nur wegen eines 
Progammierfehlers oder Hardwaredefekts passieren.

Der Bubbelsort ist aber ein stabiler Sortieralgorithmus, was bedeutet, 
dass zwei gleiche Elemente in ihrer ursprünglichen Reihenfolge stehen 
bleiben.
Es gibt auch (schnellere) Sortierverfahren, bei denen nicht garantiert 
ist, dass die Reihenfolge gleicher Elemente nicht verändert wird.

Auf den ersten Blick scheint es gleichgültig zu sein, ob die 
ursprüngliche Ordnung gleicher Elemente erhalten bleibt, aber das ist 
nicht so:

Angenommen man möchte folgendes numerisch sortiertes Telefonverzeichnis 
nach Namen und Vornamen sortieren:
1
Zeile, Name, Vorname, Nebenstelle
2
1, Hoffmann, Harald, 114
3
2, Heimermann, Dirk, 161
4
3, Faßbender, Eva, 176
5
4, Felderhoff, Stefanie, 314
6
5, Faller, Carolin, 336
7
6, Hoffmann, Marlies, 409
8
7, Heinen, Roswitha, 445
9
8, Falkenburg, Eva, 449
10
9, Hoffmann, Kerstin, 485
11
10, Heimann, Sascha, 629

Dazu wird man zunächst die Vornamen sortieren, wobei es gleichgültig 
ist, in welcher Reihenfolge die Nachnamen kommen.
Man kann dafür also das schnellste verfügbare Sortierverfahren 
verwenden. Bei sehr grossen Datenbeständen kann das einen erheblichen 
Zeitunterschied bedeuten. Es gibt sogar Verfahren, die erst einmal den 
ganzen Datenbestand dahingehend überprüfen, ob er bereits in irgend 
einer Weise vorsortiert ist, und danach entscheiden, welche 
Sortieralgorithmen verwendet werden.

Mit einem Algorithmus, der die Quelle Zeile für Zeile von vorn liest, 
und den Datensatz in die
Zielliste einfügt, !sobald das möglich ist!, erhalten wir nach und nach 
folgende Kette :
1
Harald
2
Dirk-Harald
3
Dirk-Eva(3)-Harald
4
Dirk-Eva(3)-Harald-Stefanie
5
Carolin-Dirk-Eva(3)-Harald-Stefanie
6
Carolin-Dirk-Eva(3)-Harald-Marlies-Stefanie
7
Carolin-Dirk-Eva(3)-Harald-Marlies-Stefanie-Roswitha
8
Carolin-Dirk-Eva(8)-Eva(3)-Harald-Marlies-Stefanie-Roswitha
9
Carolin-Dirk-Eva(8)-Eva(3)-Harald-Kerstin-Marlies-Stefanie-Roswitha
10
Carolin-Dirk-Eva(8)-Eva(3)-Harald-Kerstin-Marlies-Sascha-Stefanie-Roswitha

Die nach Vornamen sortierte Liste lautet nun also:
1
5, Faller, Carolin, 336
2
2, Heimermann, Dirk, 161
3
8, Falkenburg, Eva, 449
4
3, Faßbender, Eva, 176
5
1, Hoffmann, Harald, 114
6
9, Hoffmann, Kerstin, 485 
7
6, Hoffmann, Marlies, 409
8
10, Heimann, Sascha, 629
9
4, Felderhoff, Stefanie, 314
10
7, Heinen, Roswitha, 445


Beachte, dass die beiden Evas jetzt die Plätze getauscht haben, diese 
Sortierung ist also nicht stabil!
Das ist hier aber unerheblich, da die im nächsten Schritt erfolgende 
Sortierung nach Familiennamen Vorrang hat.
Ab hier muss ein stabiles Sortierverfahren verwendet werden, da sonst 
die (hier zufällig bereits richtig) vorsortierten Hoffmänner 
durcheinander geraten könnten. Nach dem obigen instabilen 
Sortierverfahren wäre deren Reihenfolge nämlich 6-9-1, was 
offensichtlich zur falschen Reihenfolge der Vornamen führt.

Vor 50 Jahren, als Speicherplatz noch knapp und teuer war, selbst 
Grossrechner hatten oft nur 512 Kilo(!)Byte RAM, und Magnetbänder das 
(langsame) Speichermedium für grosse Datenmengen waren, hat man viel 
Gehirnschmalz auf effiziente Sortierverfahren verwendet.

https://de.wikipedia.org/wiki/Sortierverfahren

https://en.wikipedia.org/wiki/IBM_System/370_Model_145

Es ist kein Fehler, sich an die damals erworbenen Kenntnisse zu 
erinnern.

von Hp M. (nachtmix)


Lesenswert?

Hp M. schrieb:
>  abc,,,, Stefanie-Roswitha

...und das Alphabet kann ich auch  nicht <KOPF-KLATSCH>

von Nils (Gast)


Lesenswert?

Schlaumaier schrieb:
> Ich hatte mal einen anderen probiert der war ca. 40% schneller aber hat
> mich 2 Tage gekostet ihn anzupassen.

Vorsicht! Beim Boublesort steigt die Laufzeit quadratisch mit der Anzahl 
der Elemente an. Kann gut sein, das es bei Deinem Testfall nur 40% 
Unterschied waren. Wie sieht es aber aus, wenn Du mal die Anzahl der zu 
sortierenden Elemente mit Faktor 100 multiplizierst? Dann steht Deine 
Kiste schnell mal für eine Sekunde oder länger. Wie sieht es bei Faktor 
1000 oder 10000 aus?

Diese Algorithmen mit O(n²) Komplexität sind gefährlich, weil man beim 
Test häufig nicht merkt wie drastisch langsam sie bei größeren 
Datenmengen werden können.

Wenn Du weist, das Du wirklich nur eine Hand voll Werte sortieren 
willst, dann sind solche billig Algorithmen tatsächlich häufig eine gute 
Wahl. Wenn Du Dir aber nicht sicher bist, dann hat Dein Code eine 
tickende Zeitbombe.

Die Zeit, die Du am Anfang in der Implementation sparst, sind nichts 
gegen den Stress, den Du mit dem Kunden hast sobald dein Code nicht mehr 
performt.

Und für die Embedded Neulinge: Auch Vorsicht mit Quicksort. Der 
Stackbedarf kann mit der Anzahl der Elemente steigen. Passiert in der 
Praxis selten, aber ich hatte schon Tester, die mit Quicksort Killer 
Sequenzen angekommen sind und mir der Stack um die Ohren geflogen ist.

Seitdem setze ich eigentlich nur noch Heapsort ein. Das habe ich vor 25 
Jahren ein mal vom Buch abgeschrieben (eine Stunde, keine zwei Tage) und 
seitdem immer mal wieder in angepasster Form verwendet.

von Schlaumaier (Gast)


Lesenswert?

Nils schrieb:
> ? Dann steht Deine
> Kiste schnell mal für eine Sekunde oder länger. Wie sieht es bei Faktor
> 1000 oder 10000 aus?

Keine Ahnung ab ca. 3-5000 Elementen aufwärts halte ich die sowieso 
nicht mehr im Speicher. Dann lagere ich die in einen Datenbank aus, und 
lasse sie mit "Order by was_ich_will" sortieren.

Der Grund ist. Habe ich so viele Elemente dann werden das zu 99% eh 
mehr. Also gleich vernünftig auslagern, anstatt sein Speicher mit z.b. 
DIM a(1000000) voll zu müllen.


Bubblesort reicht völlig aus, um kleinere Mengen an Daten zu sortieren, 
wobei ich die meist nur für einen schönere Ansicht der Daten brauche. 
User mögen es wenn sie die Daten sortiert angezeigt bekommen. Und da 
kommt es sehr selten zu mehr als 100 Elementen.

Womit ich sogar zugebe das ich noch nie mehr als ca. 500 Elemente "per 
programmierter Sortierroutine" bearbeitet habe.

Das Beispiel wo ich man 2 Tage dran gesessen habe war ein Job der ca. 
12.000 Elemente sortieren sollte und wo ich keine Datenbank verwenden 
sollte.

Der Kunde ist König, aber die Regierung hat selten Ahnung. ;)

von Nop (Gast)


Lesenswert?

Nils schrieb:

> Seitdem setze ich eigentlich nur noch Heapsort ein.

Eine weitere gute Alternative ist Shellsort mit Ciura-Sequenz, was 
schneller als Heapsort ist. Dafür hat Heapsort eine konstantere 
Laufzeit.

von Peter M. (r2d3)


Lesenswert?

Hallo Nils,

Nils schrieb:
> Schlaumaier schrieb:
>> Ich hatte mal einen anderen probiert der war ca. 40% schneller aber hat
>> mich 2 Tage gekostet ihn anzupassen.
>
> Vorsicht! Beim Boublesort steigt die Laufzeit quadratisch mit der Anzahl
> der Elemente an. Kann gut sein, das es bei Deinem Testfall nur 40%
> Unterschied waren. Wie sieht es aber aus, wenn Du mal die Anzahl der zu
> sortierenden Elemente mit Faktor 100 multiplizierst? Dann steht Deine
> Kiste schnell mal für eine Sekunde oder länger. Wie sieht es bei Faktor
> 1000 oder 10000 aus?
>
> Diese Algorithmen mit O(n²) Komplexität sind gefährlich, weil man beim
> Test häufig nicht merkt wie drastisch langsam sie bei größeren
> Datenmengen werden können.

Du hast vollkommen Recht, aber der Herr Schlaumeier veröffentlicht hier 
einen unterirdischen Beitrag nach dem nächsten.

Wer von 40% Laufzeitgewinn spricht, der hat von Laufzeitklassen nichts 
gehört. Auch die Begründung für minderwertige Algorithmen

"Sicher = Weniger Code = Weniger potenzielle Fehlerquellen."

ist hanebüchen.

Wer denn noch von DIM a(1000000) spricht, der benutzt auch REDIM.
Das alleine ist schon in O(n^2).

Bubble-Sort ist ein netter Sortieralgorithmus, geeignet für einen 
VHS-Kurs, für mehr nicht. Aber wenn der Erkenntnisprozess nicht da ist, 
kann man auch mit einer Parkuhr sprechen, das ist auch folgenlos.

[...
Der Grund ist. Habe ich so viele Elemente dann werden das zu 99% eh
mehr. Also gleich vernünftig auslagern, anstatt sein Speicher mit z.b.
DIM a(1000000) voll zu müllen.
...]

Große Probleme kann er auch nicht sortieren, dass muss dann die 
Datenbank für ihn tun:

[...
Keine Ahnung ab ca. 3-5000 Elementen aufwärts halte ich die sowieso
nicht mehr im Speicher. Dann lagere ich die in einen Datenbank aus, und
lasse sie mit "Order by was_ich_will" sortieren.
...]

von Yalu X. (yalu) (Moderator)


Lesenswert?

Diese erste Version

Joachim M. schrieb:
> int main()
> ...

ist im Wesentlichen ein deoptimierter¹ Insertion-Sort, die zweite
Version

Joachim M. schrieb:
> int main()
> ...

im Wesentlichen ein deoptimierter Selection-Sort.

Das erkennt man leicht, wenn man sich in jedem Durchlauf der äußeren
Schleife den Zwischenstand des Array-Inhalts anschaut.

Korrekt sind beide Algorithmen, im Vergleich zu den jeweiligen
Originalen werden aber mehr Vergleiche und Vertauschungen benötigt.

Wie Udo bereits schrieb, hat das Ganze mit dem Bubble-Sort nichts zu
tun. Beim Bubble-Sort werden immer nur benachbarte Array-Elemente (also
array[i] und array[i+1]) verglichen und ggf. vertauscht. Das ist hier
definitiv nicht der Fall.


¹) Ich wollte das Wort "verhunzt" vermeiden ;-)

von Schlaumaier (Gast)


Lesenswert?

Peter M. schrieb:
> Wer denn noch von DIM a(1000000) spricht, der benutzt auch REDIM.
> Das alleine ist schon in O(n^2).

Bei gewissen Programmiersprachen muss man JEDE Variable mit DIM 
deklarieren es sei denk man schaltet diese ab. Was aber kein 'Feine 
Programmierstil' ist.

DIM variablen_name as TYP.  Ist halt standard.  REDIM gibt es glaub ich 
nicht einmal mehr.

Peter M. schrieb:
> Große Probleme kann er auch nicht sortieren, dass muss dann die
> Datenbank für ihn tun:

Kann er schon. Aber ich bevorzuge halt eine einfache und übersichtliche 
Methode. Und es ist einfacher und schneller eine SQL-Abfrage über eine 
Funktion laufen zu lasen als ein großes Array mit For-Next durchsuchen 
zu wollen.

Und wenn ich schon ein Array machen muss, dann mache ich das nicht zum 
vergnügen sondern weil es sein muss.

Und bitte verwechsle Daten-Array nicht mit Typen-Array. Solche 
Typen-Array brauche ich z.b. für eine Perfekte REZIZE-Funktion des 
Frames. Einfach gesagt sobald du mehr als 640x480 Bildpunkte hast wird 
das Frame immer perfekt auf den Bildschirm dargestellt. Und das sogar 
unter Android ohne das ich dazu Klimmzüge machen muss. ;)

Ich denke eher deine Programmierkenntnisse sind sehr veraltet oder nur 
für billige Script-Sprachen.

von Hugo H. (hugohurtig1)


Lesenswert?

Joachim M. schrieb:
> Ich muss gerade was für die Informatikklausur an der Uni programmieren
> und wollte einen Sortieralgorithmus programmieren. Leider weiß ich nicht
> welchen Typ dieser hier entspricht.

Lässt Du Hausaufgaben vom "Schwarmwissen" erledigen?

Du "programmierst" einfach mal so etwas und fragst dann, was Du 
programmiert hast?

Joachim M. schrieb:
> vorraus

Uni-Niveau?

von 2⁵ (Gast)


Lesenswert?

Zunächst mal: Deine Formatierung (Einrücken) ist subotimal. Verwende 
bitte zum darstellen die c-Tags. Auch ist es für den Optimierer besser, 
wenn die Variablen dort definiert werden, wo sie gebraucht werden.
Ok, spielt jetzt bei dem Beispiel keine große Rolle. Aber: Es reicht 
eine Hilfsvariable aus, du brauchst keine 2!
1
#include <stdio.h>
2
3
int main()
4
{
5
    int array[20]={14,17,12,18,6,13,5,19,119,56,77,88,99,22,34,56,76,11,0,1};
6
7
    for(int k=0; k<20; k++) {
8
        for(int i=0; i<20; i++) {
9
            if(array[k] < array[i]) {
10
                int hilf1 = array[k];
11
                array[k] = array[i];
12
                array[i] = hilf1;
13
            }
14
        }
15
    }
16
    for(int j=0; j<20; j++) {
17
        printf("%i ", array[j]);
18
    }
19
    printf("\n");
20
    return 0;
21
}

liefert:
0 1 5 6 11 12 13 14 17 18 19 22 34 56 56 76 77 88 99 119

Die Variante mit for(int i=k+1; i<20; i++) liefert was anderes:
1
#include <stdio.h>
2
3
int main()
4
{
5
    int array[20]={14,17,12,18,6,13,5,19,119,56,77,88,99,22,34,56,76,11,0,1};
6
7
    for(int k=0; k<20; k++) {
8
        for(int i=k+1; i<20; i++) {
9
            if(array[k] < array[i]) {
10
                int hilf1 = array[k];
11
                array[k] = array[i];
12
                array[i] = hilf1;
13
            }
14
        }
15
    }
16
    for(int j=0; j<20; j++) {
17
        printf("%i ", array[j]);
18
    }
19
    printf("\n");
20
    return 0;
21
}

Und zwar: 119 99 88 77 76 56 56 34 22 19 18 17 14 13 12 11 6 5 1 0

Richtig wäre: for(int i=0; i<k; i++)

Dies wäre also der klassische Bubblesort:
1
#include <stdio.h>
2
3
int main()
4
{
5
    int array[20]={14,17,12,18,6,13,5,19,119,56,77,88,99,22,34,56,76,11,0,1};
6
7
    for(int k=0; k<20; k++) {
8
        for(int i=0; i<k; i++) {
9
            if(array[k] < array[i]) {
10
                int hilf1 = array[k];
11
                array[k] = array[i];
12
                array[i] = hilf1;
13
            }
14
        }
15
    }
16
    for(int j=0; j<20; j++) {
17
        printf("%i ", array[j]);
18
    }
19
    printf("\n");
20
    return 0;
21
}

von Joachim M. (joachim_m582)


Lesenswert?

Ah ok jetzt habe ich verstanden wie ich das machen soll. Vielen dank auf 
jeden Fall das war sehr hilfreich.
Nein das sind nicht meine Hausaufgaben und ich versuche hier gerade die 
Tutorenstunden, welche es ja dank Corona nicht gibt, zu ersetzen.

Wenn man sich in einem Punkt festgefahren hat oder es einfach noch nicht 
ganz verstanden hat. Hilft es Leute zu fragen die was davon verstehen.
Offensichtlich verstehen das manche hier nicht ganz.
Wenn ich einfach ein Code wollte könnte ich googlen. Oder wurde das 
nicht bedacht?


Trotzdem gab es viele Leute die mir sehr geholfen haben das ein bisschen 
besser zu verstehen.

von mh (Gast)


Lesenswert?

Joachim M. schrieb:
> Wenn man sich in einem Punkt festgefahren hat oder es einfach noch nicht
> ganz verstanden hat. Hilft es Leute zu fragen die was davon verstehen.
> Offensichtlich verstehen das manche hier nicht ganz.

Im nächsten Semester solltest du dich während des Semesters darum 
kümmern und nicht erst kurz vor der Klausur. Die Pandemie ist hier ne 
schlechte Ausrede.

von Hugo H. (hugohurtig1)


Lesenswert?

Joachim M. schrieb:
> Wenn ich einfach ein Code wollte könnte ich googlen. Oder wurde das
> nicht bedacht?

Woher hast Du denn den Code? Ist er Dir im Schlaf eingefallen und jetzt 
weißt Du nicht mehr, was Du gemacht hast?

Wenn Du Dir den Code selbst ausgedacht hättest wüsstest Du wohl, was Du 
gemacht hast - oder?

: Bearbeitet durch User
von Joachim M. (joachim_m582)


Lesenswert?

witzigerweise habe ich mir ein Videos zu Quicksort anguckt und habe das 
als Anfang gehabt. Und es hat funktioniert und deswegen wollte ich 
wissen was ich da produziert habe. Eigentlich wars nur ein test.
Ja nächstes Semester bombadier ich euch während des Semsters mit fragen 
dachte ich hätte das verstanden.

von mh (Gast)


Lesenswert?

Joachim M. schrieb:
> Ja nächstes Semester bombadier ich euch während des Semsters mit fragen
> dachte ich hätte das verstanden.

Wende dich an deinen Prof, der wird dafür bezahlt.

von Hugo H. (hugohurtig1)


Lesenswert?

Joachim M. schrieb:
> witzigerweise habe ich mir ein Videos zu Quicksort anguckt und habe das
> als Anfang gehabt. Und es hat funktioniert und deswegen wollte ich
> wissen was ich da produziert habe.

Erzähl das mal Deiner Oma :-)

von Joachim M. (joachim_m582)


Lesenswert?

Ich dachte der Code war so schlecht? Was ist also so unwahrscheinlich 
daran das ein Anfänger das falsche macht...

von Hugo H. (hugohurtig1)


Lesenswert?

Joachim M. schrieb:
> Ich dachte der Code war so schlecht? Was ist also so unwahrscheinlich
> daran das ein Anfänger das falsche macht...

Deine Story ist einfach zu schlecht für einen guten Freitags-Troll.

von Joachim M. (joachim_m582)


Lesenswert?

Ok wenn du meinst.

von Experte (Gast)


Lesenswert?

Schlaumaier schrieb:
> Und bitte verwechsle Daten-Array nicht mit Typen-Array. Solche
> Typen-Array brauche ich z.b. für eine Perfekte REZIZE-Funktion des
> Frames. Einfach gesagt sobald du mehr als 640x480 Bildpunkte hast wird
> das Frame immer perfekt auf den Bildschirm dargestellt.

Bahnhof?

Was ist ein "Typen-Array"? Was ist der Unterschied zu einem 
"Daten-Array"? Und was ist ein "perfektes Resize"? Und warum benötigt 
man mehr als 640x480 Bildpunkte? Zum Sortieren?

> Und das sogar unter Android ohne das ich dazu Klimmzüge machen muss.

Bahnhof-Quadrat? Welche Klimmzüge? Für was?

> Ich denke eher deine Programmierkenntnisse sind sehr veraltet oder nur
> für billige Script-Sprachen.

Oh je, mir schwant böses...

von Hugo H. (hugohurtig1)


Lesenswert?

Joachim M. schrieb:
> Ok wenn du meinst.

Ja, meine ich.

Jeder Dödel kann den Algorithmus mit Papier und Bleistift 
nachvollziehen, wenn er das denn will und rudimentäre Kenntnisse der 
Programmierung hat.

Wenn Du das nicht kannst wäre vielleicht eine Anstellung als 
Facility-Manager o.ä. passender für Dich :-)

Oh - jetzt komme ich mir fast wie C-Hater vor ... nein, das bin ich 
nicht.

: Bearbeitet durch User
von Joachim M. (joachim_m582)


Lesenswert?

Vlt. Programmierer werde ich sicher nicht. Offensichtlich habe ich noch 
keine rudimentären Kenntnisse über das Programmieren. Wenn du nicht 
helfen willst könntest du auch was besseres für die Menschheit machen 
als mich hier so anzukacken und den Besserwisser raushängen zu lassen. 
Wenn es so einfach ist hättest du deine Zeit dafür verwenden können mir 
zu helfen.

Mehr als unnötige Kommentare schreiben ist ja offensichtlich nicht drin.

von Hugo H. (hugohurtig1)


Lesenswert?

Joachim M. schrieb:
> Vlt. Programmierer werde ich sicher nicht. Offensichtlich habe ich noch
> keine rudimentären Kenntnisse über das Programmieren.

Dann hast Du Informatik als falsches Fach gewählt.

Joachim M. schrieb:
> und wollte einen Sortieralgorithmus programmieren

Das ist offensichtlich nicht gerade Deine Kernkompetenz. Was willst denn 
mal werden (Facility-Manager mal ausgenommen)?

Joachim M. schrieb:
> Mehr als unnötige Kommentare schreiben ist ja offensichtlich nicht drin.

Doch - aber nicht für Menschen wie Dich :-)

von Joachim M. (joachim_m582)


Lesenswert?

Ingenieur nicht für info...
Aber offensichtlich muss ich mir das Programmieren nochmal angucken ;D

: Bearbeitet durch User
von Hugo H. (hugohurtig1)


Lesenswert?

Joachim M. schrieb:
> Ingenieur nicht für info...

Nun, auch und gerade da muss man logisch denken können - oder?

Joachim M. schrieb:
> int array[10]={4,7,2,8,6,3,5,9,0,1};
>    for(k=0;k<10;k++){
>        for(i=0;i<10;i++){
>            if(array[k]<array[i]){
>             hilf1=array[k];
>             hilf2=array[i];
>             array[k]=hilf2;
>             array[i]=hilf1;

Was genau passiert denn in "Deinem" Programm? Es werden immer 2 Werte 
verglichen

if(array[k]<array[i])

und vertauscht, wenn der 2. Wert größer wie der 1. Wert ist. Für mich 
ist das ein popliger Bubble-Sort.

Wenn ich falsch liege ist es halt so :-)

von Joachim M. (joachim_m582)


Lesenswert?

Dachte ich ja auch. Aber irgendwie wurden mir immer wieder gesagt es 
wäre keiner. Aber wie gesagt ich kann nicht behaupten, dass ein 
Bubblesort mein Ziel gewesen war.

Danke auf jeden Fall.

: Bearbeitet durch User
von Hugo H. (hugohurtig1)


Lesenswert?

Hugo H. schrieb:
> größer

Kleiner - und es wird umgekehrt sortiert :-/ - aber trotzdem Bubblesort.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

Joachim M. schrieb:
> Aber irgendwie wurden mir immer wieder gesagt es wäre keiner.

Man muss ja auch nicht immer alles glauben, was die Leute so sagen.

Besser ist es, selber zu recherchieren.

Hier findest du mehrere Bubble-Sorts aus (vermutlich) voneinander
unabhängigen Quellen:

  https://de.wikipedia.org/wiki/Bubblesort
  https://en.wikipedia.org/wiki/Bubble_sort
  https://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort

Vergleiche sie mit deinem Code, und du wirst feststellen, dass die
Leute, die behaupten, dein Code sei kein Bubble-Sort, recht haben.

von Hugo H. (hugohurtig1)


Lesenswert?

Yalu X. schrieb:
> Vergleiche sie mit deinem Code, und du wirst feststellen, dass die
> Leute, die behaupten, dein Code sei kein Bubble-Sort, recht haben.

Ich vermute, Du meinst mich damit.
Welcher genau ist es denn?

von mh (Gast)


Lesenswert?

Yalu X. schrieb:
> Besser ist es, selber zu recherchieren.
>
> Hier findest du mehrere Bubble-Sorts aus (vermutlich) voneinander
> unabhängigen Quellen:
>
>   https://de.wikipedia.org/wiki/Bubblesort
>   https://en.wikipedia.org/wiki/Bubble_sort
>   https://rosettacode.org/wiki/Sorting_algorithms/Bubble_sort

In der Zeit, die er hier vergeudet hat, hätte er sich Algorithmen und 
Datenstrukturen von Wirth in seiner Uni-Bibliothek ausleihen und das 
Kapitel über Sortieralgorithmen durcharbeiten können. Ich hab bei drei 
Unis nachgeschaut, überall waren mehrere vorhanden und ausleihbar, auch 
als rein digitale Version, für die man das Haus nichtmal verlassen muss.

von Experte (Gast)


Lesenswert?

mh schrieb:
> In der Zeit, die er hier vergeudet hat, hätte er sich Algorithmen und
> Datenstrukturen von Wirth in seiner Uni-Bibliothek ausleihen und das
> Kapitel über Sortieralgorithmen durcharbeiten können.

Warum selber arbeiten, wenn einem in Forum die Hausaufgaben gemacht 
werden? Das ist ja sicherlich nicht das einzige Forum, wo man seine 
Fragen abstellen kann. Wenn Du das parallel mit 5 Foren machst, in jedem 
Forum ein anderes Thema bearbeiten lässt, kommst Du schnell voran.

von Buddy haut den Lukas (Gast)


Lesenswert?

Fazit: Es ist Trollsort

von Joachim M. (joachim_m582)


Lesenswert?

Ich habe ehrlicherweise noch nicht verstanden von was für Hausaufgaben 
du redest? Hat dir jemand Hausaufgaben gegeben und dann wurden die 
Kontrolliert?

Den Cormen habe ich tatsächlich gefunden und gedownloadet. Wirth 
hingegen finde ich nicht.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Joachim M. schrieb:
> Wirth hingegen finde ich nicht.

Nikolaus Wirth: "Algorithmen und Datenstrukturen"

gesucht mit: Wirth Algorithmen Datenstrukturen

z.B. hier:
https://sites.google.com/site/tesdenatant/home/algorithmen-palilwu3qcwotvjq


oder der hier:
https://www.hs-bremen.de/internet/hsb/struktur/mitarbeiter/schormann/skripte/echte_programmierer.pdf

: Bearbeitet durch User
von Pandur S. (jetztnicht)


Lesenswert?

>Keine Ahnung ab ca. 3-5000 Elementen aufwärts halte ich die sowieso
nicht mehr im Speicher. Dann lagere ich die in einen Datenbank aus, und
lasse sie mit "Order by was_ich_will" sortieren.

Dann wird das Ganze nie was. Vergiss Informatik, das hat keinen Sinn so.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.