ID mit Wert nach sortierung wieder richtig ausgeben

Gast #6121146
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
Gast #6121674
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
Gast #6121699
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.
#6121710
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.
Gast #6122087
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
}
Gast #6122123
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.
Gast #6122134
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.
Gast #6122151
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.