Mittwoch, 1. September 2010

Arrays sortieren

Eine sehr wichtige Funktion im Umgang mit Daten ist das Sortieren dieser.
Das .Net Framework stellt eine Menge Methoden dafür bereit, Arrays zum Beispiel lassen sich sehr leicht über die Methode Array.Sort() sortieren.
Diese sortiert das übergebene Array aufsteigend mit Hilfe des Quicksort - Algorithmus, welcher einer der besten Sortieralgorithmen ist.
Folgendes Beispiel sortiert ein integer - Array aufsteigend nach ihrer Größe (bei Buchstaben und Wörtern werden diese alphabetisch geordnet):

int[] TestArray = new int[] { 5, 3, 4, 1, 2 }; // Kurzschreibweise zur Erstellung von Arrays
Array.Sort(TestArray);

Das Ergebnis ist anschließend direkt in TestArray gespeichert, d.h. die Manipulation der Daten wurde direkt am Array vorgenommen, da in .Net Array - Typen Verweis - Typen sind.
Um das Array absteigend zu sortieren, kann nach der Sortierung einfach die Methode Array.Reverse() aufgerufen werden, welche das Array umkehrt:
Array.Reverse(TestArray);
Für an der Theorie Interessierte und aus Werbung an der eigenen Sache, hier findet ihr eine Android App von mir, die verschiedene Sortieralgorithmen (u. a. Quicksort) visualisiert.

Kommentare:

  1. Hey,
    Hat mir sehr geholfen, danke für den tollen beitrag.
    mfg

    AntwortenLöschen
  2. was ist programmieren?!

    AntwortenLöschen
  3. Gibt es denn eine Möglichkeit der Sortiermethode ein Subarray zu geben? Das also nur eine bestimmte Länge und nicht das gesammte Array Sortiert wird?
    Ich hab nämlich das Problem, dass beim sortieren NULL-Werte NICHT ignoriert werden, sondern noch unter A stehen! Array.Sort(Array[0, int]) funktioneirt leider nicht :(

    AntwortenLöschen
  4. Hallo, was meinst du?
    Möchtest du das gegebene Array nur von Index start bis Index end sortieren?
    Das macht der folgende Code:
    Array.Sort(TestArray, null, start, end);

    AntwortenLöschen
  5. Funktioniert bei mir nicht, in der Textbox steht dann immer system.int32[]...

    AntwortenLöschen
    Antworten
    1. Was kommt denn nach den "..."? Kannst du mal deinen Code posten?

      Löschen
  6. system.int32[]... der Fehler liegt daran dass man wenn man ein Komplettes Int Array in ein Text umwandeln will damit er es anzeigt jedes einzelne element einzeln in der Textbox Anzeigen lassen muss

    Damit geht es:
    for (int i = 0; i < deinArray.Length; i++)
    {
    deineTextBox.Text += deinArray[i].ToString();
    }

    AntwortenLöschen
  7. Hallo!

    Ich habe vor 2 wochen mit C# lernen angefangen. Im moment möchte ich einen Taschenrechner schreiben. Das Problem, welches ich habe, ist dass man bei:

    Console.WriteLine("Bitte gib eine Zahl ein:");
    int zahl = Convert.ToInt32(Console.ReadLine());

    eine Fehlermeldung bekommt, sobald man einen Buchstaben eingibt. Wie kann ich forcieren, dass NUR Zahlen eingegeben werden können, damit dieser Error vermieden werden kann? Ich habe schon etwas mit Regex gelesen, habe es aber überhaupt nicht verstanden und auch nicht anwenden können... Wäre dankbar für jede Hilfe!

    Lg Ben

    AntwortenLöschen
    Antworten
    1. Hallo Ben,

      schön, dass du angefangen hast C# zu lernen!

      Genau, eine Möglichkeit wäre reguläre Ausdrücke zu benutzen (abgekürzt Regex) - dafür würde ich dir aber hier nicht raten, da es noch eine deutlich einfachere Möglichkeit gibt. Du kannst die Funktion Int32.TryParse() benutzen, was insgesamt so aussieht:

      Console.WriteLine("Bitte gib eine Zahl ein:");
      int zahl;
      bool ZahlEingegeben = Int32.TryParse(Console.ReadLine(), out zahl);
      if (ZahlEingegeben)
      Console.WriteLine("Zahl eingegeben.");
      else
      Console.WriteLine("Etwas anderes eingegeben.");

      Dazu noch etwas Werbung in eigener Sache: Zufälligerweise habe ich vor Kurzem angefangen, eine Video-Tutorial Reihe zu C# zu erstellen, in welcher momentan die ersten 2 Videos online sind (https://www.youtube.com/watch?v=FT1kBSp8qgk&list=PLyl7Z066HGBM207yoNiVweuptW_ZA9Oag). Über diese bist du mit deinen bisher erworbenen Fähigkeiten schon hinaus, aber vielleicht schaust du ja später mal vorbei!

      Viel Spaß und Erfolg beim Programmieren.
      Viele Grüße
      Oliver

      Löschen
  8. irgendwie funktioniert das bei meinem geschriebenen programm nicht hat jemand eine idea und kann mir helfen

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace lotto_zahlen
    {
    class Program
    {
    static void Main(string[] args)
    {

    Random lotto = new Random();
    Random zusatzZahl = new Random();

    int benutzerEingabe;
    Console.WriteLine("Wie viele lottozahlen möchten Sie sich ausgeben lassen?");
    benutzerEingabe = Convert.ToInt32 (Console.ReadLine());
    int[] lotto6= new int[6];
    int zwischenSpeicher;
    int zusatzZahl1;


    for (int i = 0 ; i <benutzerEingabe ; i++)
    {
    lotto6 = new int[6];
    zusatzZahl1 = zusatzZahl.Next(0,9);
    Console.Write("Ihre Lottozahlen: ");
    for (int j = 0; j < lotto6.Length; j++)
    {
    bool eintragVorhanden = false;
    do
    {
    zwischenSpeicher = lotto.Next(1, 49);
    if (lotto6.Contains(zwischenSpeicher))
    {
    eintragVorhanden = true;
    }
    else
    {
    eintragVorhanden = false;
    }

    } while (eintragVorhanden == true);

    lotto6[j] = zwischenSpeicher;


    Console.Write(lotto6[j]+",");


    }
    Console.WriteLine("\nIhre Zusatzzahl = "+ zusatzZahl1+ "\n");
    }
    Console.WriteLine("!!Ich wünsche Ihnen viel glück!!");
    Console.ReadKey();



    }
    }
    }

    AntwortenLöschen