Array sortieren kein bubble sort. Problem

Talinsei

Member
27 August 2008
9
2
Hallo,soll einen Such Algorithmus programmieren. Habe die Daten vorher aus einer datei ausgelesen und möchte sie danach sortieren. Allerdings verhaspelt sich mein Programm ab der 6 Stufe. Sieht da jemand was o_O?




Hier die Datei :

4
20
12
8
16
6
10
14
2
18
-3
21
0



#include <stdlib.h>
#include <stdio.h>


int main() {
FILE *datei;
const int ANZAHL = 20, LAENGE=5;
char line[ANZAHL][LAENGE];
int num[ANZAHL];
int i;
datei = fopen ("/Users/Tim/Documents/Praktikum 6/sort.dat","r+");
if (datei != NULL)
{
while (!feof(datei)) {


fgets(line,LAENGE,datei);

num = atoi(line);

printf ("%i ",num);
i++;

}



} else {printf("Öffnen Fehlgeschlagen");}


int position = 0;
int zahl = 0;
int durchlaufe = 0;
int j=0;
int buffer=0;

while(durchlaufe<i) {
printf("Durchlaufnummer : %i\n", durchlaufe);
zahl = num[durchlaufe];

for(j=durchlaufe;j<=i;j++) {
if(zahl>num[j+1]) {
zahl=num[j+1];
position=j+1;
}
}

buffer = num[durchlaufe];
num[durchlaufe] = zahl;
num[position]=buffer;
durchlaufe++;

for(int g=0;g<i;g++) {
printf(" %i ", num[g]);





}
}








fclose (datei);

return 0;

}
Ausgabe :

4 20 12 8 16 6 10 14 2 18 -3 21 0 Durchlaufnummer : 0
-3 20 12 8 16 6 10 14 2 18 4 21 0 Durchlaufnummer : 1
-3 0 12 8 16 6 10 14 2 18 4 21 20 Durchlaufnummer : 2
-3 0 2 8 16 6 10 14 12 18 4 21 20 Durchlaufnummer : 3
-3 0 2 4 16 6 10 14 12 18 8 21 20 Durchlaufnummer : 4
-3 0 2 4 6 16 10 14 12 18 8 21 20 Durchlaufnummer : 5
-3 0 2 4 6 8 10 14 12 18 16 21 20 Durchlaufnummer : 6
-3 0 2 4 6 8 10 14 12 18 10 21 20 Durchlaufnummer : 7
-3 0 2 4 6 8 10 10 12 18 14 21 20 Durchlaufnummer : 8
-3 0 2 4 6 8 10 10 12 18 12 21 20 Durchlaufnummer : 9
-3 0 2 4 6 8 10 10 12 12 18 21 20 Durchlaufnummer : 10
-3 0 2 4 6 8 10 10 12 12 18 21 20 Durchlaufnummer : 11
-3 0 2 4 6 8 10 10 12 12 18 20 21 Durchlaufnummer : 12
-3 0 2 4 6 8 10 10 12 12 18 20 21 logout
 
Dein Algorithmus hat genau dann ein Problem, wenn hinter der aktuellen Zahl keine kleinere Zahl mehr kommt. D.h. in deinem Durchlauf Nr. 6 passt soweit noch alles (da wird ja die 8 mit der 16 vertauscht).
Im 7. Durchlauf findest du keine kleinere Zahl mehr als die 10. Du versuchst die Zahlen zu vertauschen und überschreibst die position, welche in Durchlauf 6 gefunden wurde (weil sie ja in Durchlauf 7 nicht mehr verändert wird).

Lösung: Du musst die Position bei jedem while-durchlauf neu initialisieren. D.h. position auf durchlaufe setzen, dann vertauscht du im Durchlauf 7 die Zahl 10 mit 10 selbst, und somit funktioniert der Algo wieder korrekt.
 
Hey, danke für deine Antwort :). Meinst du das so ?

while(durchlaufe<i) {
int position = 0;
printf("Durchlaufnummer : %i\n", durchlaufe);
zahl = num[durchlaufe];

damit kommt :

4 20 12 8 16 6 10 14 2 18 -3 21 0 Durchlaufnummer : 0
-3 20 12 8 16 6 10 14 2 18 4 21 0 Durchlaufnummer : 1
-3 0 12 8 16 6 10 14 2 18 4 21 20 Durchlaufnummer : 2
-3 0 2 8 16 6 10 14 12 18 4 21 20 Durchlaufnummer : 3
-3 0 2 4 16 6 10 14 12 18 8 21 20 Durchlaufnummer : 4
-3 0 2 4 6 16 10 14 12 18 8 21 20 Durchlaufnummer : 5
-3 0 2 4 6 8 10 14 12 18 16 21 20 Durchlaufnummer : 6
10 0 2 4 6 8 10 14 12 18 16 21 20 Durchlaufnummer : 7
10 0 2 4 6 8 10 12 14 18 16 21 20 Durchlaufnummer : 8
14 0 2 4 6 8 10 12 14 18 16 21 20 Durchlaufnummer : 9
14 0 2 4 6 8 10 12 14 16 18 21 20 Durchlaufnummer : 10
18 0 2 4 6 8 10 12 14 16 18 21 20 Durchlaufnummer : 11
18 0 2 4 6 8 10 12 14 16 18 20 21 Durchlaufnummer : 12
21 0 2 4 6 8 10 12 14 16 18 20 21 logout

man nähert sich ;). Nurnoch eine falsche Zahl, jetzt sortiert das ding richtig. Macht allerdings schweinerein mit der -3.
 
while(durchlaufe<i) {
printf("Durchlaufnummer : %i\n", durchlaufe);
zahl = num[durchlaufe];
position = durchlaufe;

position ist ja schon zuvor deklariert worden, d.h. das "int" in der schleife kommt da nicht mehr hin.

Das Ergebnis ist nicht überraschend ;). mit position=0 sagst du ja, dass der wert an der position "0" vertauscht werden soll. Somit wird deine -3 da auch weggelöscht. Du willst ja von der aktuellen position aus sortieren, weil die Zahlen vor "durchlaufe" ja schon sortiert sind. Deshalb setzt du nun position auf "durchlaufe" (siehe oben).

[edit]
for(j=durchlaufe;j<=i;j++) {
...num[j+1]...
Schau dir das nochmals an. Auf die schnelle schaut das so aus, als ob du 1 element über dein Array schaust? (Oder sogar 2 stück drüber? Wenn i = 2; dann ist num[0] und num[1] gesetzt. D.h. num[2] und num[2+1] 'gibts nicht'.)
[/edit]
 
Zuletzt bearbeitet: