info1_uebungen/07/selectionsort_zgr.c
2026-05-28 13:47:32 +02:00

124 lines
3.8 KiB
C

/*****************************************************************
* Schreiben Sie ein Programm, das vom Benutzer abfragt, *
* wie viele Zahlen eingelesen werden sollen und diese *
* dann mittels SelectionSort sortiert. SelectionSort *
* geht eine Liste von Zahlen von links nach rechts durch, *
* ermittelt das Minimum der Zahlen, die rechts der aktuellen *
* Position liegen inklusive der Zahl der aktuellen Position, *
* und tauscht das Minimum mit der Zahl auf die aktuelle *
* Position. Alle Zahlen bis zu dieser Position inklusive gelten *
* dann als sortiert. Diese Prozedur wird für jede Position von *
* links nach rechts durchgeführt, bis alle Zahlen sortiert sind.*
* *
* Beispiel für Sortierung einer Liste 5 3 0 2: *
* Setze Minimum der Restliste an 1. Position: 0 3 5 2 *
* Setze Minimum der Restliste an 2. Position: 0 2 5 3 *
* Setze Minimum der Restliste an 3. Position: 0 2 3 5 *
* *
* Beispielhafte Ausgabe: *
* >> Wie viele Zahlen (max. 100)? fsdf *
* >> Fehler! Erneute Eingabe: -1 *
* >> Fehler! Erneute Eingabe: 101 *
* >> Fehler! Erneute Eingabe: 5 *
* >> Geben Sie die 1. Zahl ein: dsf *
* >> Fehler! Erneute Eingabe: 45 *
* >> Geben Sie die 2. Zahl ein: 1 *
* >> Geben Sie die 3. Zahl ein: 0 *
* >> Geben Sie die 4. Zahl ein: -4 *
* >> Geben Sie die 5. Zahl ein: 1423 *
* Sortierte Zahlen: -4 0 1 45 1423 *
* *
*****************************************************************/
#include <stdio.h>
#include "../io/myio.h"
#define MAX_ZAHLEN 100
void selectionsort(int array[], unsigned int len);
int *findeMax(int *anfang, int *ende);
void tausche(int *elem1, int *elem2);
void zeigeArray(int array[], unsigned int len);
unsigned int gibLaengeEin(unsigned int max);
int main()
{
int zahlen[MAX_ZAHLEN] = {0};
unsigned int len = gibLaengeEin(MAX_ZAHLEN);
for(int i = 0; i < len; i++)
{
printf("%d. Zahl:\n", i+1);
zahlen[i] = getNumber("Geben Sie eine Zahl ein: ");
}
printf("\nEingebene Zahlen: ");
zeigeArray(zahlen, len);
selectionsort(zahlen, len);
printf("\nSortierte Zahlen: ");
zeigeArray(zahlen, len);
return 0;
}
void zeigeArray(int array[], unsigned int len)
{
for(int i = 0; i < len; i++)
{
printf("%3d ", array[i]);
}
printf("\n");
}
int *findeMax(int *anfang, int *ende)
{
int *max = anfang;
while(anfang <= ende)
{
if(*anfang > *max)
{
max = anfang;
}
anfang++;
}
return max;
}
void selectionsort(int array[], unsigned int len)
{
for(int unsortierteLaenge = len; unsortierteLaenge >= 2; unsortierteLaenge--)
{
int *max = findeMax(array, array+unsortierteLaenge-1);
tausche(max, &array[unsortierteLaenge-1]);
}
}
/*void tausche(int array[], unsigned int idx1, unsigned int idx2)
{
int tmp = array[idx1];
array[idx1] = array[idx2];
array[idx2] = tmp;
}*/
void tausche(int *elem1, int *elem2)
{
int tmp = *elem1;
*elem1 = *elem2;
*elem2 = tmp;
}
unsigned int gibLaengeEin(unsigned int max)
{
unsigned int laenge = 0;
printf("Maximale Laenge: %d\n", max);
while(laenge <= 0 || laenge > max)
laenge = getNumber("Geben Sie die Anzahl an Zahlen ein: ");
return laenge;
}