Forum: PC-Programmierung ID mit Wert nach sortierung wieder richtig ausgeben


von helpme91 (Gast)


Lesenswert?

Hallo zusammen,

ich arbeite gerade in C mit dem Algorithmus „insertionsort“.
Ich sortiere damit ein Array.
Mein Problem ist, das jeder Wert im Array einer ID zugeordnet ist.
Wenn ich nach der ID suche, soll der zugehörige Wert ausgegeben werden.
Die Sortierung der float Werte funktioniert einwandfrei (absteigend). 
Leider bekomme ich es nicht hin, dass er mir danach die richtige ID zum 
float Wert anzeigt.

Beispiel:
Vor der Sortierung hat der float Wert: 2,453 die ID: 2.
Die soll der Wert auch nach der Sortierung haben. Egal auf welcher 
Position sich nach der Sortierung der float Wert befindet, er hat immer 
die gleich ID. Aktuelle hat er dann leider die falsche.

Bitte euch um Hilfe.

Ein Code Beispiel würde mir sehr Helfen.

SG

von Jens M. (schuchkleisser)


Lesenswert?

Ganz einfach:

Da, wo die Stelle ist die den Float sortiert, muss eine zweite Zeile den 
Index in der zweiten Spalte mitsortieren (bzw. neu schreiben).

von Dirk B. (dirkb2)


Lesenswert?

Wie ist denn die Zuordnung von float zur ID?

Ein zweites Array oder eine struct oder ...?

von helpme91 (Gast)


Lesenswert?

struct

von Dirk B. (dirkb2)


Lesenswert?

helpme91 schrieb:
> struct

Dann tausch die komplette struct aus.

Das geht genauso wie integrale Typen.

von helpme91 (Gast)


Lesenswert?

Darf ich euch um ein kurzes Beispiel bitten?

Ich tu mir dann leichter es zu verstehen.

Danke.

von Dirk B. (dirkb2)


Lesenswert?

Zeig uns, was du geschrieben hast.

Dann kommen schon die Verbesserungsvorschläge.

von helpme91 (Gast)


Lesenswert?

Darf ich leider nicht.
Der Code für die Sortierung ist von jemand anderen.
Ich bearbeite den nur.
Ein einfach Beispiel reicht mir schon.

von Dirk B. (dirkb2)


Lesenswert?

Dann zeig die paar Zeilen, wo du die Felder kopierst/vertauscht.

von DPA (Gast)


Lesenswert?

Mit den infos kann man kein nützliches Beispiel bringen, wir wissen ja 
noch nicht mal, ob du ein Array von Strukts, eine linked list von 
structs, oder was anderes hast, neben dem ganzen unbekannten Rest.Schau 
dir mal qsort an, vielleicht passts ja zufällig. 
http://www.cplusplus.com/reference/cstdlib/qsort/

von helpme91 (Gast)


Lesenswert?

Hier ein Beispiel für Insertionsort (Beispiel aus dem Netz):
1
void insertionSort(wert arr[], int n)  
2
{  
3
    int i,j; 
4
    float key;
5
  
6
    for (i = 1; i < 4; i++) 
7
    {  
8
        key = arr[i].zahlen;  
9
        j = i - 1;  
10
  
11
        while (j >= 0 && arr[j].zahlen > key) 
12
        {  
13
            arr[j + 1].zahlen = arr[j].zahlen;  
14
            j = j - 1;  
15
        }  
16
        arr[j + 1].zahlen = key;  
17
    }  
18
}

struct array hat : int ID und float zahlen.

Ich sortiere jetzt nach arr[].zahlen.

Unsortiert:

6.34 -> ID:1
3.54 -> ID:2
5.23 -> ID:3
7.88 -> ID:4

Sortiert soll es dann so aussehen:

3.54 -> ID:2
5.23 -> ID:3
6.34 -> ID:1
7.88 -> ID:4

Sortierung der Werte funktioniert ja aber ich bekomme es nicht hin,
dass er mir die ID zum passenden Wert angibt. Die ist dann komplett 
durcheinander.

Wie muss der Code jetzt aussehen, dass das funktioniert?

SG

von Nick M. (Gast)


Lesenswert?

helpme91 schrieb:
> Wie muss der Code jetzt aussehen, dass das funktioniert?

Wurde doch schon gesagt.
Pack float und id zusammen in einen struct und schaufle diesen struct um 
beim sortieren. Nicht nur den float.

Das ist so basic! Lies mal N. Wirth. Algorithmen und Datenstrukturen. Da 
steht das bestimmt drinnen. Und bei der Gelegenheit wirst du noch sooooo 
viel mehr lernen.

von Dirk B. (dirkb2)


Lesenswert?

helpme91 schrieb:
> Wie muss der Code jetzt aussehen, dass das funktioniert?

Mach key nicht vom Typ float sondern vom Typ wert.

Dann musst du natürlich die Zugriffe anpassen.

Nochmal: Es geht auch key = arr[i]; (wenn key eine struct ist)

Der Vergleich in der while-Schleife muss aber weiterhin den float Teil 
vergleichen.

von DPA (Gast)


Lesenswert?

1
void insertionSort(wert arr[], int n)  
2
{  
3
    for (int i = 1; i < n; i++) // Ich nehme mal an n statt 4?
4
    {  
5
        wert key = arr[i].zahlen;  
6
        int j = i - 1;  
7
  
8
        while (j >= 0 && arr[j].zahlen > key.zahlen)
9
        {  
10
            arr[j + 1] = arr[j];  
11
            j = j - 1;  
12
        }  
13
        arr[j + 1] = key;  
14
    }  
15
}

Aber hier ware eventuell wirklich qsort sinnvoller, wozu das rad neu 
erfinden, wenn es das in c schon fertig gibt?
1
#include <stdlib.h>
2
3
int comperatorWertByZahlen(const void *pa, const void *pb){
4
  const wert* A = pa;
5
  const wert* B = pb;
6
  return B.zahlen - A.zahlen; // A und B vertauschen, um Reihenfolge zu ändern
7
}
8
9
void sortWertByZahlen(wert arr[], int n){
10
  qsort(arr, n, sizeof(*arr), comperatorWertByZahlen);
11
}

von helpme91 (Gast)


Lesenswert?

Nochmal, ich habe ein struct array. In dem sich die zahlen und die ID 
befindet.

Ich muss insertionsort verwenden, das ist so festgelegt.

Ich habe euch gebeten, das ihr mir das anhand eines Beispiels zeigt.
Wäre es möglich, das jemand in den Code den ich gepostet habe das 
reinschreibt? Dannkann ich das sehen und nachvollziehen.

So komme ich leider nicht weiter.
Leider habe ich auch nicht die Zeit mir ein Buch zu kaufen und das dort 
nachzuvollziehen.

Ich muss das heute fertigstellen.

Bitte, danke.

von Jens M. (schuchkleisser)


Lesenswert?

Das wird nix.
Du trollst, und du wirst getrollt.

Wenn du die oben gegebenen Tips nicht in den vorhandenen Quellcode 
einbauen kannst, hast du ihn nicht verstanden, und in diesem Fall 
solltest du ersthaft die Finger da raus lassen.

von DPA (Gast)


Lesenswert?

helpme91 schrieb:
> Wäre es möglich, das jemand in den Code den ich gepostet habe das
> reinschreibt?

Hab ich doch, direkt im Post oben dran hab ich die insertionSort 
Funktion doch bereits angepasst! (Edit: ich hab noch vergessen, die 
Zeile "wert key = arr[i].zahlen;" ganz anzupassen, sollte "wert key = 
arr[i];" sein, aber der rest sollte passen!)

helpme91 schrieb:
> Der Code für die Sortierung ist von jemand anderen.
> Ich bearbeite den nur.

Vielleicht solltest du demjenigen einfach beichten, dass du weder 
programmieren kannst, noch dazu lust hast, es zu lernen. Das meme ein 
Programierer würde nur Code aus dem Internet zusammenkopieren, 
entschpricht nicht der Realität.

von Nick M. (Gast)


Lesenswert?

helpme91 schrieb:
> So komme ich leider nicht weiter.

Dann gib halt deine Hausaufgabe nicht ab. So erkennt der Lehrer deine 
Motivation auch und benotet entsprechend.

von NeinNein (Gast)


Lesenswert?

helpme91 schrieb:
> Ein Code Beispiel würde mir sehr Helfen.

Bei der Beantwortung der Frage würde dein bisheriger Code auch helfen,
um auf den Fehler hinweisen zu können

Dafür bist du zu faul.

helpme91 schrieb:
> Hier ein Beispiel für Insertionsort (Beispiel aus dem Netz):

DEINEN Code.

(übrigens ist der falsch und sortiert nur das zahlen-Element der 
Struct).

helpme91 schrieb:
> Darf ich leider nicht.
> Der Code für die Sortierung ist von jemand anderen.
> Ich bearbeite den nur.

Spinner. Mach deine Hausaufgaben selber statt abzuschreiben.

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.