Geht das Selection Sortier Algorithmus durch? Verbesserungsvorschläge wären Top!

OP #6635331
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;
}
Gast #6635732
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.
OP #6635746
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;
}
Gast #6635814
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
}
Gast #6635851
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.
Gast #6636106
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?
OP #6636275
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
}
Gast #6636287
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.
OP #6636350
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
}
Gast #6636407
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.
Gast #6636493
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 ...
Gast #6636532
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.
Gast #6636711
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.
Gast #6636736
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?
OP #6636853
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!
Gast #6637104
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren