Hallo zusammen,
ich möchte gerne Daten (Energie) in einem Array sortieren, aber dabei
die Information nicht verlieren welche Leistungsstufe die Energie
umgesetzt hat.
Also konkret:
Leistungsstufe Energie (kWh)
--------------------------------------
1 12
2 6
3 7
Ich möchte nach der Energie sortieren. Also wäre das ja dann
6, 7, 12 (in der Reihenfolge). Jetzt habe ich die Energie ja aufsteigend
sortiert, aber ich weiß ja nicht mehr welcher Leistungsstufe diese
gehört.
Klar kann ich z.B. mit Quicksort ein Array sortieren, aber wie verliere
ich die damit verknüpften Daten nicht? Was würdet ihr als bestes \
schnellsten Sortieralgorithmus für diese Fragestellung ansehen
(Sortieralgo. am besten nicht rekursiv)?
Wenn der Index auch die Leistungsstufe darstellt: Wie willst du die
Element-Reihenfolge überhaupt verändern, ohne diesen Zusammenhang zu
verlieren? Was hat das mit einem spezifischen Algorithmus zu tun? Du
könntest Leistungsstufe und Energie per Tupel oder Struct zusammenkleben
und das Array dann sortieren (Energie). Über die verwendete
Programmiersprache lässt du dich aber auch nicht aus ...
Hallo,
das geht mit jedem Sortieralgorithmus, du musst lediglich statt den
einzelnen Werten ganze Zeilen tauschen/verschieben. Wenn deine Listen
jetzt nicht gigantisch groß werden oder in einer extrem ineffizienten
Sprache der Algorithmus implementiert wird dürfte die Laufzeit des
Algorithmus kaum praktische Auswirkungen haben. Ansonsten hast du hier
eine große Auswahl, je nach dem, wie viel Arbeit du investieren
möchtest:
https://de.wikipedia.org/wiki/Sortierverfahren
Gruß Kai
Yalu X. schrieb:> In Haskell geht's so:> sortOn snd [(1,12), (2,6), (3,7)]
Was es alles für Programmiersprachen gibt... für mich ist C nach wie vor
das einzig Wahre. Sowohl für µC als auch für Win GUIs, Linux etc.
Lua tue ich mir vielleicht noch an wegen dem ESP8266.
Gut der TO hat ja nicht gesagt welche Programmiersprache er verwendet.
Von daher kann man ja auch Lösungswege in Fortran, ADA, Rust und Java
posten
Wieviele Leistungsklassen hast Du, und wie zeitkritisch ist deren
Sortierung?
Wenn es nur drei sind, brauchst Du keinen Algorithmus, dann tun es
Abfragen auch.
Bei 32 oder mehr wäre Shellsort die Lösung, wenn es auf die absolute
Schnelligkeit ankommt. Ist eine geringe Varianz des Zeitbedarfs wichtig,
dann ist Heapsort die Lösung. Beide sind ohne Rekursion. Hast Du
allenfalls 8 Einträge, wäre Insertion-Sort die Antwort.
Gilt für bis zu 128 Einträge, was für embedded wohl die häufigste
Situation sein dürfte. Zig Millionen Einträge hat man embedded
schlichtweg nicht. In diesem Maßstab von Listengröße sind beide übrigens
auch schneller als Quicksort.
Mein persönlicher Favorit ist Shellsort, und zwar mit der empirischen
Folge nach Ciura.
Hier noch ein interessanter Quellenlink:
http://embeddedgurus.com/stack-overflow/2009/03/sorting-in-embedded-systems/
Nop schrieb:> Wieviele Leistungsklassen hast Du, und wie zeitkritisch ist deren> Sortierung?
Es werden sechs Leistungsklassen sein, also nicht allzu viel.
Soll wie schon richtig erkannt auf einem embedded Controller laufen,
deswegen auch Misra-C. Misra-C verbietet leider den Einsatz von
Rekusionen, deswegen auch die Frage nach einem verfahren ohne
Rekursion^^.
Ich habe mir mal den Link von dir angesehen. Da scheint ja InsertionSort
das beste Verfahren für mein Aufgabe zu sein.
Ich müsste ja dann eh eine eigene Sortieralgorithmus-Funktion schreiben,
da ich ja die Verknüpfung zwischen Energie und Leistungsklasse ja nicht
verlieren will.
@Patrick L. (crashdemon)
>> Wieviele Leistungsklassen hast Du, und wie zeitkritisch ist deren>> Sortierung?>Es werden sechs Leistungsklassen sein, also nicht allzu viel.
Praktisch gar nix! Das ist Pille-Palle!
>Soll wie schon richtig erkannt auf einem embedded Controller laufen,>deswegen auch Misra-C. Misra-C verbietet leider den Einsatz von>Rekusionen, deswegen auch die Frage nach einem verfahren ohne>Rekursion^^.
Nimm Bubble-Sort, das gehört zum kleinen 1x1 des Programmierens!
>Ich habe mir mal den Link von dir angesehen. Da scheint ja InsertionSort>das beste Verfahren für mein Aufgabe zu sein.
Bei den paar Daten ist das vollkommen schnuppe.
>Ich müsste ja dann eh eine eigene Sortieralgorithmus-Funktion schreiben,>da ich ja die Verknüpfung zwischen Energie und Leistungsklasse ja nicht>verlieren will.
Mein Gott, bis du in der Programmierer-Grundschule? Ein 2D Array zu
sortieren ist ja nun weiß Gott trivial!
Falk B. schrieb:> Nimm Bubble-Sort, das gehört zum kleinen 1x1 des Programmierens!
Ist auch bei den Datenmengen schlechter als Insertionsort, siehe den
Link. Bubblesort ist IMMER schlecht.
Ansonsten programmiert man den Sortieralgorithmus halt ganz normal und
tauscht außer den Sortierdaten auch die zweite Spalte des Arrays mit
durch, bzw. das zweite Array, wenn man das separat hat.
Oder man hat ein Array mit Structs, die Leistungsklasse und Verbrauch
als Komponenten haben. Die kann man mit tmp-struct und memcpy tauschen,
oder, falls sich das speichermäßig ausgeht, kann man auch eine Union mit
nem Basisdatentyp drüberlegen.
Vorlage gibt's übrigens hier:
https://rosettacode.org/wiki/Sorting_algorithms/Insertion_sort#C
Patrick L. schrieb:> void railEnergySort(TRailEnergy *railEnergy, unsigned int numRails)> {> ...> }
Gratuliere zu deiner ersten Bubblesort-Implementierung ;-)
Hier eine Variante die etwas weiger hin und her kopiert:
Patrick L. schrieb:> Hab da mal was herunter-gehackt.
Kleine Anmerkung: wenn Du MISRA-Konformität möchtest, solltest Du auf
Deklarationen mit "unsigned int" verzichten und einen geeigneten
Datentypen aus stdint.h wählen.
Für die Energie ist offenbar uint32_t gemeint. Für die Schleifenzähler
und min käme uint_fast8_t in Frage.
Nop schrieb:> Kleine Anmerkung: wenn Du MISRA-Konformität möchtest, solltest Du auf> Deklarationen mit "unsigned int" verzichten und einen geeigneten> Datentypen aus stdint.h wählen.>> Für die Energie ist offenbar uint32_t gemeint. Für die Schleifenzähler> und min käme uint_fast8_t in Frage.
Danke Nop für die Anmerkung. War nur ebend herunter-gehackt um zu
zweigen das es läuft, die richtige Implementierung wird dann auch alle
Misra belange berücksichtigen.