Wie kann man in C# ein CharArray sortieren?

... komplette Frage anzeigen

2 Antworten

Also strikt gesehen dürfte das hier erlaubt sein:

char[] sortiert = input.ToList().Sort().ToArray();

Aber um mal die Aufgabe wie vorgesehen zu lösen schlage ich den "Bubble Sort" vor. Wie und warum der genau funktioniert kannst du hier nachlesen: https://de.wikipedia.org/wiki/Bubblesort

Das coole bei C# hierbei ist: 

Du kannst du Werte auch mit > und < vergleichen da alle Chars einen ASCII Wert besitzen und beim vergleichen von zwei Chars intern mit dieser Nummer gerechnet wird. a-z und A - Z stehen alphabetisch sortiert in der ASCII Tabelle weshalb 

if ('c' > 'a') 

true ist.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von YswaggerY
26.09.2016, 21:45

Naja, die Challenge ist ja gerade keine Sortierung vorzunehmen, die in irgendwelchen Windows Assemblys verbaut ist, zu verwenden. Das tust du aber mit ".Sort()". Das möchte ich ja gerade vermeiden.

0

Erst einmal zu deinem Programmcode:

Die Variable var_e wird zwar initialisiert, da sie aber nicht mehr verwendet wird ist sie sinnlos.

Du gehst zwar in deiner geschachtelten Schleife das Input Array durch und vergleichst, ob die Sortierung passt - wenn nicht fügst du den vorherigen Wert in deine neue Ziel-Liste var_d ein. Und da liegt eines der Probleme: Das source-Array input wird dabei nicht verändert und beim nächsten Durchgang findet wieder ein Vergleich der selben Werte ab.

Da du in der ersten inneren Schleife den Zähler var_b nie mehr auf 0 setzt, wird diese nur einmal ausgeführt, der zweit-größte Wert (>> var_c = input[var_b] und nicht var_b + 1) anschließend 4 mal in deine Zielliste eingefügt. (Siehe Anhang: dump.PNG)

Mein Lösungsvorschlag wäre so: Für den Anfang würde ich den BubbleSort empfehlen, da dieser nicht allzu kompliziert zu verstehen ist (googlen). Das Grundprinzip darin liegt, dass du bei jedem Schleifendurchgang das größte Element nach hinten verschiebst und bei der nächsten Iteration alle Elemente davor vergleichst. (Dabei kannst du vollständig auf List<T> verzichten, du arbeitest nur auf deinem input-Array.

Man könnte noch prüfen, ob getauscht wurde und dann vorzeitig abbrechen, aber so könnte eine einfache Implementierung aussehen:
>> http://pastebin.com/CNQcdhCn

Hab das hier mit LinqPad getestet:

var input = new [] { 'a', 'e', 'd', 'f' };
input.Dump();
Sort(input);
input.Dump();

mgf GustavAT

Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?