Forum: PC-Programmierung Geht das Selection Sortier Algorithmus durch? Verbesserungsvorschläge wären Top!


von Joachim M. (joachim_m582)


Lesenswert?

Wollte eine selection Sortier-Algorithmus programmieren:
Hab ich das  hiermit geschafft? Und wo könnte ich ihn verbessern?

#include <stdio.h>

int main() //start Hauptprogramm
{
    int stelle,hilf,k, j ; //Deklaration

    int array[5]={2,4,3,1,0}; //initialisierung des arrays

  for (k = 0; k < (4); k++) // kleinstes Element finden
  {
    stelle=k; //Stelle wird zugewiesen

    for (j=k+1;j<5;j++){//Test ob stelle kleinsten Wert hat und ggf. 
anpassend er Stelle
      if (array[stelle]>array[j])
        stelle=j;
    }
    if (stelle!=k){ //Sortieren des kleinsten Elementes an die richtige 
Stelle
      hilf=array[k];
      array[k]=array[stelle];
      array[stelle]=hilf;
    }
  }

  for (k=0;k<5;k++){
    printf("%i\n",array[k]); // Ausgabe
    }
  return 0;
}

: Verschoben durch Admin
von MagIO2 (Gast)


Lesenswert?

1. Ja
2. Verbessern in Bezug worauf?

Kommentare, die keine wesentliche Information hinzufügen, die kann man 
auch weg lassen.
z.B. main = Hauptprogramm ... das weiß jeder
Deklaration, Initialisierung des Arrays

Die erste for-Schleife ist gar falsch kommentiert. Du willst dort nicht 
das kleinste Element finden, sondern das ist die Schleife, die auf das 
aktuell einzusortierende Element zeigt. Links von dieser Stelle ist 
schon alles sortiert, rechts davon ist der unsortierte Bereich.

stelle ist auch ein seltsamer Name. Je besser die Namen der Variablen 
gewählt werden, um so besser ist der Code auch ohne zusätzlicher 
Kommentare zu lesen. ( Die Länge des Namens ist natürlich 
Abwägungssache, gegebenenfalls auch durch eine Programmiersprache 
begrenzt. )
idx_minimum wäre mal ein Beispiel.

   idx_minimum = k;   // aktuellen Index als Minimum initialisieren

Erst die nächste Schleife soll im unsortierten Bereich nachschauen, ob 
da noch ein kleinerer Wert zu finden ist.

    // Suche im unsortierten Bereich den Index, der die kleinste Zahl 
beinhaltet
    for (j=k+1;j<5;j++) {


Eine Sortier-Funktion würde man üblicherweise auch wirklich als Funktion 
programmieren. Das heißt sie kann von anderen Teilen des Programms mit 
entsprechenden Parametern aufgerufen werden und führt die Sortierung mit 
beliebigen Arrays durch. Das heißt, dass die for-Schleifen keinen festen 
Wert als Abbruch-Kriterium beinhalten können.

Die Ausgabe des Arrays wäre dann wieder Sache des Aufrufers und gehört 
nicht mit in die Sortier-Funktion.

Hier kommt es halt darauf an, was mit der Übung erreicht werden soll.
Auf jeden Fall könnte man z.B. auch im vorliegenden Programm schon mit 
sizeof() arbeiten, um besser mit Änderungen im Array umgehen zu können. 
Nur weil man nun 2 Zahlen dazufügt, sollte man nichts im Code ändern 
müssen, weil das Fehleranfällig ist.

von Joachim M. (joachim_m582)


Lesenswert?

Vielen Dank für das Feedback.
Ich hatte bereits eine Version mit Eingabe gemacht und morgen versuche 
ich mich sicher mal an einer Abwandlung als Funktion.
#include <stdio.h>

int main() //start Hauptprogramm
{
    int stelle,hilf,k, j, groesseArray ; //Deklaration
    int array[groesseArray];

 for (k = 0; k < groesseArray; k++)
    printf ("%i ", array[k]);
  printf ("Anzahl der gewollten Elemente\n");
  scanf ("%i", &groesseArray);

  printf ("%i Elemente eingeben\n", groesseArray);

  for (k = 0; k < groesseArray; k++)
    {
      scanf ("%i", &array[k]);
    }

 for (k = 0; k < (groesseArray-1); k++) //aktuelle Stelle
  {
    stelle=k; //Stelle wird zugewiesen

    for (j=k+1;j<groesseArray;j++){//Test ob stelle kleinsten Wert hat 
und ggf. anpassend er Stelle
      if (array[stelle]>array[j])
        stelle=j;
    }
    if (stelle!=k){ //Sortieren des kleinsten Elementes an die richtige 
Stelle
      hilf=array[k];
      array[k]=array[stelle];
      array[stelle]=hilf;
    }
  }

  for (k=0;k<groesseArray;k++){
    printf("%i ",array[k]); // Ausgabe
    }
return 0;
}

von Flush (Gast)


Lesenswert?

Warum zwei Threads zum gleichen Thema?

von Experte (Gast)


Lesenswert?

Ah, der, der seine Hausaufgaben machen lässt, versucht es nochmals.

Dieser Thread kann weg.

von m.n. (Gast)


Lesenswert?

Überschrift und Text stossen übel auf. Vielleicht sollte man zunächst 
mal das Geschlecht klären.
Ich stimme für der Algorithmus.

von 2⁵ (Gast)


Lesenswert?

Wäre es zu viel verlangt, wenn du endlich den C-Quelltext in [ c ] und [ 
/c ] Tags (ohne Leerzeichen in den eckigen Klammern) einschließen 
würdest? Dann sähe das so wie unten aus und wäre für alle besser lesbar. 
Du wirst ja heute und morgen wohl noch ein paar Algorithmen 
programmieren und hier vorstellen wollen. Nur als Tipp: Zu "meiner Zeit" 
war das Standardwerk dazu "Robert Sedgewick: Algorithms". Das Buch ist 
auch in den weiten des Netzes als PDF zu finden.
1
#include <stdio.h>
2
3
int main() //start Hauptprogramm
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++) { // kleinstes Element finden
8
        int stelle = k; // Stelle wird zugewiesen
9
        for (int j=k+1; j<20; j++) { // Test ob stelle kleinsten Wert hat und ggf. anpassen
10
            if (array[stelle] > array[j])
11
                stelle = j;
12
        }
13
        if (stelle != k) { // Sortieren des kleinsten Elementes an die richtige Stelle
14
            int hilf = array[k];
15
            array[k] = array[stelle];
16
            array[stelle] = hilf;
17
        }
18
    }
19
    for (int k=0; k<20; k++) {
20
        printf("%i ",array[k]); // Ausgabe
21
    }
22
    printf("\n");
23
    return 0;
24
}

von MagIO2 (Gast)


Lesenswert?

Hmmmm ... die Version mit der Eingabe hat aber schon noch einige Fehler.

Was denkst du passiert denn im Deklarations-Teil?
Du führst eine Variable groesseArray ein und dann ein Array von selbiger 
Größe.
Aber welche Größe hat dann dein Array? Was soll der Compiler daraus 
machen? Bestenfalls ist groesseArray undefiniert und hat einen Wert der 
gerade zufällig im RAM steht. Schlimmstenfalls wird dir der Compiler 
groesseArray auf 0 initialisieren, dann hast du aber auch ein Array von 
der Größe 0.

Und eine Eingabe eines anderen Wertes für groesseArray würde auch nichts 
daran ändern.

Um das Programm so flexibel zu machen müsstest du erst mal wissen, wie 
man dynamisch Speicher anfordert (und am besten auch gleich, wie man den 
wieder freigeben kann). Bin mir nicht so ganz sicher, ob das für die 
Aufgabe schon gefordert wird. Bleib doch erst mal bei Arrays, die im 
Programm selbst definiert werden, passe aber die Sortier-Funktion so an, 
dass sie mit unterschiedlich großen Arrays umgehen kann.

Ein Schritt nach dem Anderen.

von PittyJ (Gast)


Lesenswert?

Ich habe in deinem anderen Thread schon geschrieben: zu Sortieren gibt 
es einschlägige Literatur. Lies die doch erst mal durch!
Inbesondere bevor die Frage zu Quicksort kommen.

von Werner (Gast)


Lesenswert?

Joachim M. schrieb:
> int stelle,hilf,k, j, groesseArray ; //Deklaration
>     int array[groesseArray];

ließ sich das wirklich übersetzen?

von mh (Gast)


Lesenswert?

Werner schrieb:
> Joachim M. schrieb:
>> int stelle,hilf,k, j, groesseArray ; //Deklaration
>>     int array[groesseArray];
>
> ließ sich das wirklich übersetzen?

Jepp. Und wenn man keine Warnungen aktiviert, kann man ungestört in 
seiner Traumwelt rumbasteln. Glaubt jemand, dass Joachim Warnungen 
aktiviert hat?

von Joachim M. (joachim_m582)


Lesenswert?

Also Warnungen sollten aktiviert sein. Aber dann lass ich das erstmal 
wollte mir nur überlegen wie es funktionieren könnte.

von Joachim M. (joachim_m582)


Lesenswert?

Ist das so möglichst flexibel oder geht das noch besser mit der 
Anpassbarkeit auf andere arrays? Ohne mit dynamischen speichern zu 
arbeiten.
1
#include <stdio.h>
2
3
int sortierung (int array[], int groesseArray){
4
 int stelle,hilf,k, j;
5
for (k = 0; k < (4); k++) // kleinstes Element finden
6
  {
7
   
8
    stelle=k; //Stelle wird zugewiesen
9
10
    for (j=k+1;j<5;j++)//Test ob stelle kleinsten Wert hat und ggf. anpassend er Stelle
11
    {
12
      if (array[stelle]>array[j])
13
        stelle=j;
14
    }
15
    if (stelle!=k){ //Sortieren des kleinsten Elementes an die richtige Stelle
16
      hilf=array[k];
17
      array[k]=array[stelle];
18
      array[stelle]=hilf;
19
    }
20
  }
21
}
22
23
int main() //start Hauptprogramm
24
{
25
  
26
int array[5]={2,4,3,1,0};//initialisierung des arrays 
27
int groesseArray=5;
28
sortierung(array, groesseArray);
29
int k;
30
31
  for (k=0;k<5;k++)
32
  {
33
    printf("%i ",array[k]); // Ausgabe
34
    }
35
    
36
  return 0;
37
}

von tja (Gast)


Lesenswert?

verwende mal in deiner Funktion noch den Übergabeparameter groesseArray, 
sonst haut's dir das ganze um die Ohren, wenn das Array <5 ist, oder es 
funktioniert nicht, wenn >5 Elemente.

zudem bin ich ein großer Fan von einheitlicher Sprache: wenn die 
Programmiersprache Englisch ist, dann sollten auch Funktions- und 
Variablennamen Englisch sein. Beim Kommentar kann man sich streiten. 
Aber Denglisch finde ich persönlich nicht gut.

von Joachim M. (joachim_m582)


Lesenswert?

Ich habs einmal in der Funktion und in der Ausgabe ausgetauscht. 
Abgesehen vom  Denglisch dann aber ganz in Ordnung?
1
#include <stdio.h>
2
3
int sortierung (int array[], int groesseArray){
4
 int stelle,hilf,k, j;
5
for (k = 0; k < (groesseArray-1); k++) // kleinstes Element finden
6
  {
7
   
8
    stelle=k; //Stelle wird zugewiesen
9
10
    for (j=k+1;j<5;j++)//Test ob stelle kleinsten Wert hat und ggf. anpassend er Stelle
11
    {
12
      if (array[stelle]>array[j])
13
        stelle=j;
14
    }
15
    if (stelle!=k){ //Sortieren des kleinsten Elementes an die richtige Stelle
16
      hilf=array[k];
17
      array[k]=array[stelle];
18
      array[stelle]=hilf;
19
    }
20
  }
21
 
22
}
23
24
25
26
int main() //start Hauptprogramm
27
{
28
  
29
int array[5]={2,4,3,1,0};//initialisierung des arrays 
30
int groesseArray=5;
31
sortierung(array, groesseArray);
32
int k;
33
34
  for (k=0;k<groesseArray;k++)
35
  {
36
    printf("%i ",array[k]); // Ausgabe
37
    }
38
    
39
  return 0;
40
}

von Einer K. (Gast)


Lesenswert?

Joachim M. schrieb:
> oder geht das noch besser mit der
> Anpassbarkeit auf andere arrays?

Im Moment kann es wohl nur int sortieren.
Kein Float, Zeichenketten, oder gar Strukturen.

Es gibt in der CLib ja schon qsort()
Wenn deine Funktion das gleiche Interface verwenden würde, wären nicht 
nur die Vergleichscallback untereinander austauschbar, sondern auch der 
Algorithmus selber.

von mh (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Joachim M. schrieb:
>> oder geht das noch besser mit der
>> Anpassbarkeit auf andere arrays?
>
> Im Moment kann es wohl nur int sortieren.
> Kein Float, Zeichenketten, oder gar Strukturen.
>
> Es gibt in der CLib ja schon qsort()
> Wenn deine Funktion das gleiche Interface verwenden würde, wären nicht
> nur die Vergleichscallback untereinander austauschbar, sondern auch der
> Algorithmus selber.

Glaubst du ernsthaft, dass er das Interface richtig implementieren und 
nutzen kann? Da kommen da kommen Pointer drin vor ...

von Einer K. (Gast)


Lesenswert?

mh schrieb:
> Glaubst du ernsthaft, dass er das Interface richtig implementieren und
> nutzen kann?
Ka!
Ist mir auch völlig egal.

Die Frage war:
> oder geht das noch besser mit der
> Anpassbarkeit auf andere arrays?
Und die habe ich so beantwortet, wie ich sie mir selber beantworten 
würde, wenn das meine Aufgabe wäre.


mh schrieb:
>  Da kommen da kommen Pointer drin vor ...
Pointer gehören zum C Grundwortschatz, ohne diese zu kennen, hasste 
sowieso (über kurz oder lang) verschissen.

von mh (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> mh schrieb:
>>  Da kommen da kommen Pointer drin vor ...
> Pointer gehören zum C Grundwortschatz, ohne diese zu kennen, hasste
> sowieso (über kurz oder lang) verschissen.

Das gleiche könnte man zu Quicksort und Info-Studium sagen ;-)

von Einer K. (Gast)


Lesenswert?

m.n. schrieb:
> Vielleicht sollte man zunächst
> mal das Geschlecht klären.

Hää....
Was hat das Geschlecht mit sortieren zu tun?
Außer deinem offensichtlichem Hang zum Diskriminieren?

mh schrieb:
> Glaubst du ernsthaft, dass er das Interface richtig implementieren und
> nutzen kann? Da kommen da kommen Pointer drin vor ...
Auch hier....

Weiß nicht, wie es den anderen geht, aber ich empfinde solche 
Vorurteilsträchtigen Postings als sehr unangenehm.

von mh (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> m.n. schrieb:
>> Vielleicht sollte man zunächst
>> mal das Geschlecht klären.
>
> Hää....
> Was hat das Geschlecht mit sortieren zu tun?
> Außer deinem offensichtlichem Hang zum Diskriminieren?
Lies dir den Titel dieses Threads nochmal genau durch, bevor du andere 
beschuldigst.

> mh schrieb:
>> Glaubst du ernsthaft, dass er das Interface richtig implementieren und
>> nutzen kann? Da kommen da kommen Pointer drin vor ...
> Auch hier....
>
> Weiß nicht, wie es den anderen geht, aber ich empfinde solche
> Vorurteilsträchtigen Postings als sehr unangenehm.
Hast du dir diesen und den Zwillings-Thread durchgelesen? Das hat wenig 
mit Vorurteilen zu tun. Der TO hat deutlich bewiesen, dass er kein C 
beherrscht. Du willst ihm tatsächlich empfelen, sich mit Pointern und 
der damit verbundenen Fehlersuche zu beschäftigen, wenn er eigentlich 
Sortieralgorithmen für eine Informatikklausur lernen sollte?

von Peter D. (peda)


Lesenswert?

Joachim M. schrieb:
> Wollte eine selection Sortier-Algorithmus programmieren:

Wozu neu erfinden. Was gefällt Dir an der C library function qsort() 
nicht?

von Joachim M. (joachim_m582)


Lesenswert?

Erstmal sehr angenehm dass jemand mal etwas dazu gesagt hat. Ich konnte 
das nicht, da ich ja keine Ahnung hab wie komisch der Titel war. Ich 
finde solche Kommentare auch sehr unangenehm. Zum Glück gibt es hier 
auch viele Leute die konstruktive Vorschläge gemacht haben und mir dabei 
geholfen haben das Thema etwas besser zu verstehen.

Und zweitens wir haben uns mit verschiedenen Sortieralgorithmen 
beschäftigt und ich wollte dafür mal selbst welche machen, da man 
dadurch selbige besser versteht. Aus der biblio die Sachen kopieren kann 
ich natürlich auch.

Und drittens: Ja ich beschäftige mich mit Pointern aber logischerweise 
noch nicht hier sondern in einfacheren Anwendungen.

Dank auf jeden Fall für die Hilfe!

von MagIO2 (Gast)


Lesenswert?

for (j=k+1;j<5;j++)

Da müsste aber auch noch groesseArray mit rein.
Sowas wäre dir sicher aufgefallen, wenn du dein Programm auch mal mit 
verschiedenen und verschieden großen Arrays ausgeführt hättest.

Also was kann man besser machen: Testen, testen, testen ... ;o)

von Joachim M. (joachim_m582)


Lesenswert?

Hatte ich schon abgeändert.
Aber Danke.

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.