Einführung in das Sortieren in C #

Beim Sortieren in c # wird der Inhalt einer Sammlung in einer bestimmten Reihenfolge angeordnet. Eine Sammlung kann ein Array, eine Liste oder eine andere Datengruppe sein. Die Auflistung kann sowohl Elemente einfacher als auch komplexer Typen enthalten. Ein einfacher Typ kann eine Auflistung von Ganzzahlen, Zeichenfolgen, Gleitkommazahlen usw. sein. Ein komplexer Typ kann eine Auflistung von Objekten benutzerdefinierter Typen wie Employee, Student usw. sein. Komplexe Typen sind mehr als häufig verschachtelt Die Objekte können mehrere Attribute haben.

Beispiele

  • Einfacher Typ
    • Ganzzahlige Sammlung - (1, 2, 3, 4, 5)
    • Streichersammlung - (“Mark”, “Jamie”, “Anna”)
  • Komplexer Typ
    • ((Name: "Mark", Mitarbeiter-ID: "123", Büro: "London"),
      (Name: "Jane", Mitarbeiter-ID: "456", Büro: "NY"),
      (Name: "Annie", Mitarbeiter-ID: "789", Büro: "Sydney"))

C # bietet integrierte Methoden zum Sortieren von Sammlungen. Sei es ein Array, eine Liste oder eine generische Auflistung, die C # Sort () - Methode kann sie basierend auf dem bereitgestellten Comparer sortieren. Intern verwendet die .NET-Implementierung den Quicksort-Algorithmus, um Sammlungen in C # zu sortieren. Wir werden in den folgenden Abschnitten des Artikels mehr darüber diskutieren.

Wie wird in C # sortiert?

Wie bereits erwähnt, verwendet das .Net-Framework den Quicksort-Ansatz, um die Elemente in einer C # -Sammlung zu sortieren. Also, was ist Quicksort?

Quicksort verfolgt eine Divide and Conquer-Strategie. Dies bedeutet, dass der Sortieralgorithmus ein Pivot-Element auswählt und das Array basierend auf dem Pivot-Element unterteilt. Die Elemente, die kleiner als der Drehpunkt sind, werden davor platziert. Die Elemente, die größer als der Drehpunkt sind, werden danach platziert. Dies stellt sicher, dass das Schwenkelement sortiert ist. Das Array ist außerdem in zwei Elemente unterteilt, die kleiner als der Drehpunkt sind, und in Elemente, die größer als der Drehpunkt sind. Als nächstes folgt der Algorithmus für beide Arrays demselben Ansatz.

Eine Illustration davon ist unten zu sehen.

Unsortiertes Array - 18, 5, 16, 23, 50, 32

Schritt 1 (Pivot = 32) - 18, 5, 16, 23, 32, 50

Schritt 2a
Unsortiertes Array - 18, 5, 16, 23
Drehpunkt = 23
Teilweise sortiertes Array - 18, 5, 16, 23

Schritt 2b
Unsortiertes Array - 50
Drehpunkt = 50
Teilweise sortiertes Array - 50

Schritt 3a
Unsortiertes Array - 18, 5, 16
Drehpunkt = 16
Teilweise sortiertes Array - 5, 16, 18

Sortiertes Array - 5, 16, 18, 23, 32, 50

Somit verfügt Quicksort über zwei Schlüsselprozesse - Auswahl des Pivots und Partitionierung des Arrays. Die Implementierungen des Algorithmus hängen von der Auswahl des Pivots ab. Dies kann entweder das erste oder das letzte Element oder ein beliebiges zufälliges Element oder der Median des Arrays sein. Sobald die Partition abgeschlossen und der Drehpunkt an der richtigen Position platziert ist, wird der Algorithmus für die partitionierten Arrays rekursiv aufgerufen, bis jedes Element sortiert ist.

Wenn in C # sortiert wird, entsteht das Konzept von stabilem und instabilem Quicksort. Wenn in einem stabilen Quicksort zwei Elemente gleich sind, bleibt ihre Reihenfolge aus dem ursprünglichen Array erhalten. Ansonsten ist es in einem instabilen Quicksort. Die C # -Implementierung verwendet instabiles Quicksort.

Arten der Sortierung in C #

In diesem Abschnitt des Artikels konzentrieren wir uns hauptsächlich auf zwei Arten von Sammlungen in C # - Arrays und Listen. Wir werden uns eingehend damit befassen, wie C # die Arrays und Listen sortiert. Im nächsten Abschnitt wird versucht, dies anhand einiger Beispiele zu erläutern.

1. Sortieren eines Arrays in C #

Betrachten wir die verschiedenen Arten, wie wir ein Array in C # sortieren können.

ein. Standardvergleich verwenden

Dies ist die Standardmethode Sort (). Wenn der Methode kein Comparer explizit übergeben wird, ordnet C # die Elemente in aufsteigender Reihenfolge an.

Code:

using System;
public class Program
(
public static void Main()
(
String() strArray = ("I", "Am", "Learning", "Array", "Sorting", "In", "C#");
int() intArray = (23, 76, 12, 43, 90, 30);
Array.Sort(strArray);
Array.Sort(intArray);
Console.WriteLine("Sorted String Array:\n");
DisplayArray(strArray);
Console.WriteLine("\n\n\nSorted Integer Array:\n");
DisplayArray(intArray);
)
static void DisplayArray(string() arr)
(
foreach (string a in arr)
(
Console.Write(a + "\t");
)
)
static void DisplayArray(int() arr)
(
foreach (int a in arr)
(
Console.Write(a + "\t");
)
)
)

Ausgabe:

b. Benutzerdefinierten Vergleich verwenden

Wir können auch einen eigenen benutzerdefinierten Vergleicher für die Sort () - Methode bereitstellen. Dies würde den C # -Compiler anweisen, den benutzerdefinierten Vergleicher anstelle des Standardvergleichers zu verwenden.

Um einen benutzerdefinierten Vergleicher zu erstellen, müssen Sie die Compare () - Methode über die IComparer-Schnittstelle implementieren. Der folgende Code zeigt, wie ein Vergleich erstellt wird, bei dem die Elemente in absteigender Reihenfolge sortiert werden.

Wir haben eine Klasse erstellt, sie von der IComparer-Schnittstelle geerbt, die Compare () -Methode implementiert und sie überschrieben, um die Elemente in absteigender Reihenfolge zu vergleichen.

Code:

using System;
public class DescendingComparer : System.Collections.IComparer
(
public int Compare(Object a, Object b)
(
return (new System.Collections.CaseInsensitiveComparer()).Compare(b, a);
)
)
public class Program
(
public static void Main()
(
String() strArray = ("I", "Am", "Learning", "Array", "Sorting", "In", "C#");
int() intArray = (23, 76, 12, 43, 90, 30);
Array.Sort(strArray, new DescendingComparer());
Array.Sort(intArray, new DescendingComparer());
Console.WriteLine("Sorted String Array in Descending Order:\n");
DisplayArray(strArray);
Console.WriteLine("\n\n\nSorted Integer Array in Desc Order:\n");
DisplayArray(intArray);
)
static void DisplayArray(string() arr)
(
foreach (string a in arr)
(
Console.Write(a + "\t");
)
)
static void DisplayArray(int() arr)
(
foreach (int a in arr)
(
Console.Write(a + "\t");
)
)
)

Ausgabe:

c. Verwenden von Schlüsselwertpaaren

Mit C # können Sie ein Array auch nach Schlüsselwerten eines anderen Arrays sortieren. Das folgende Beispiel enthält Schlüsselwertpaare von Vor- und Nachnamen von Personen. Wir würden sie sowohl nach Vor- als auch nach Nachnamen sortieren, indem wir die Sort () -Methode verwenden.

Code:

using System;
public class Program
(
public static void Main()
(
String() firstNames = ("Tom", "Jack", "Anna", "Veronica", "Jessica", "Mike");
String() lastNames = ("Phelps", "Anderson", "Spectre", "Clarke", "Williams", "Fonseca");
Array.Sort(firstNames, lastNames);
Console.WriteLine("Sorted by First Names:\n");
DisplayArray(firstNames, lastNames);
Array.Sort(lastNames, firstNames);
Console.WriteLine("\n\nSorted by Last Names:\n");
DisplayArray(firstNames, lastNames);
)
static void DisplayArray(string() arr1, string() arr2)
(
for (int i = 0; i < arr1.Length; i++)
(
Console.WriteLine(arr1(i) + " " + arr2(i));
)
)
)

Ausgabe:

2. Sortieren einer Liste in C #

Betrachten wir die verschiedenen Arten, wie wir eine Liste in C # sortieren können.

Hinweis - Verwenden von Listen in C #, einschließlich der Bibliothek System.Collections.Generic.

ein. Standardvergleich verwenden

Dies ist die Standardmethode sort (). Wenn kein Vergleicher explizit an die Methode übergeben wird, ordnet c # die Elemente in aufsteigender Reihenfolge an.

Code:

public class Program
using System.Collections.Generic;
(
public static void Main()
(
String() strArray = ("I", "Am", "Learning", "Array", "Sorting", "In", "C#");
List strList = new List(strArray);
int() intArray = (23, 76, 12, 43, 90, 30);
List intList = new List(intArray);
strList.Sort();
intList.Sort();
Console.WriteLine("Sorted String List:\n");
DisplayList(strList);
Console.WriteLine("\n\n\nSorted Integer List:\n");
DisplayList(intList);
)
static void DisplayList(List myList)
(
foreach (string a in myList)
(
Console.Write(a + "\t");
)
)
static void DisplayList(List myList)
(
foreach (int a in myList)
(
Console.Write(a + "\t");
)
)
)

Ausgabe:

b. Benutzerdefinierten Vergleich verwenden

Wir können auch einen eigenen benutzerdefinierten Vergleich für die sort () -Methode bereitstellen. Dies würde den C # -Compiler anweisen, den benutzerdefinierten Vergleicher anstelle des Standardvergleichers zu verwenden.

Um einen benutzerdefinierten Vergleicher zu erstellen, müssen Sie die Compare () - Methode über die IComparer-Schnittstelle implementieren. Der folgende Code zeigt, wie ein Vergleich erstellt wird, bei dem die Elemente in absteigender Reihenfolge sortiert werden.

Wir haben eine Klasse erstellt, sie von der IComparer-Schnittstelle geerbt, die Compare () -Methode implementiert und sie überschrieben, um die Elemente in absteigender Reihenfolge zu vergleichen.

Code:

using System;
using System.Collections.Generic;
public class LengthComparer : IComparer
(
public int Compare(string a, string b)
(
return (a.Length.CompareTo(b.Length));
)
)
public class DigitSumComparer : IComparer
(
public int Compare(int a, int b)
(
int sum_a = 0;
int sum_b = 0;
while (a > 0)
(
sum_a += (a % 10);
a /= 10;
)
while (b > 0)
(
sum_b += (b % 10);
b /= 10;
)
return (sum_a.CompareTo(sum_b));
)
)
public class Program
(
public static void Main()
(
LengthComparer lc = new LengthComparer();
DigitSumComparer dsc = new DigitSumComparer();
String() strArray = ("I", "Am", "Learning", "Array", "Sorting", "In", "C#");
List strList = new List(strArray);
int() intArray = (23, 76, 12, 43, 90, 30);
List intList = new List(intArray);
strList.Sort(lc);
intList.Sort(dsc);
Console.WriteLine("Sorted String List by Length:\n");
DisplayList(strList);
Console.WriteLine("\n\n\nSorted Integer List by Sum of Digits:\n");
DisplayList(intList);
)
static void DisplayList(List myList)
(
foreach (string a in myList)
(
Console.Write(a + "\t");
)
)
static void DisplayList(List myList)
(
foreach (int a in myList)
(
Console.Write(a + "\t");
)
)
)

Ausgabe:

Sortieren komplexer Listentypen

Komplexe Listentypen sind benutzerdefinierte Listen. Genauer gesagt handelt es sich um Listen von Objekten benutzerdefinierter Klassen. Benutzerdefiniert sind die Objekte eine Mischung aus verschiedenen primitiven Typen. Es ist schwierig, einen komplexen Listentyp zu sortieren. Der C # -Compiler erwartet, dass jede komplexe Klasse von der IComparable-Schnittstelle erbt und die Methode CompareTo () definiert. Diese Methode enthält Anweisungen zum Vergleichen der Elemente der Liste zum Sortieren.

Im folgenden Beispiel definieren wir eine benutzerdefinierte Klasse von Mitarbeitern und sortieren die Mitarbeiterobjekte anhand ihrer IDs.

Beispiel 1

Code:

using System;
using System.Collections.Generic;
public class Employee : IComparable
(
public int id (get;set;)
public string name(get;set;)
public double salary(get;set;)
public int CompareTo(Employee e)
(
return this.id.CompareTo(e.id);
)
)
public class Program
(
public static void Main()
(
List emps = new List();
emps.Add(new Employee()
(id = 123, name = "Tom Phelps", salary = 20000.00));
emps.Add(new Employee()
(id = 897, name = "Jack Anderson", salary = 40050.50));
emps.Add(new Employee()
(id = 342, name = "Anna Spectre", salary = 31030.89));
emps.Add(new Employee()
(id = 219, name = "Veronica Clarke", salary = 66333.66));
emps.Add(new Employee()
(id = 642, name = "Jessica Williams", salary = 50505.05));
emps.Add(new Employee()
(id = 923, name = "Mike Fonseca", salary = 76543.21));
Console.WriteLine("Original Employee List:\n");
DisplayList(emps);
emps.Sort();
Console.WriteLine("\n\nSorted Employee List by IDs:\n");
DisplayList(emps);
)
static void DisplayList(List emp)
(
foreach (Employee e in emp)
(
Console.WriteLine("Id: " + e.id + ", Name: " + e.name + ", Salary: " + e.salary);
)
)
)

Ausgabe:

Die naheliegende Frage ist, was passiert, wenn die Objekte der Employee-Klasse nach einer anderen Eigenschaft sortiert werden sollen? Das ist möglich. Wir müssten die IComparer-Schnittstelle implementieren. Schauen wir uns das folgende Beispiel an, um es zu verstehen.

Beispiel # 2

Code:

using System;
using System.Collections.Generic;
public class Employee
(
public int id (get;set;)
public string name(get;set;)
public double salary(get;set;)
)
public class SortByName : IComparer
(
public int Compare(Employee e1, Employee e2)
(
return e1.name.CompareTo(e2.name);
)
)
public class SortBySalary : IComparer
(
public int Compare(Employee e1, Employee e2)
(
return e1.salary.CompareTo(e2.salary);
)
)
public class Program
(
public static void Main()
(
SortByName sbn = new SortByName();
SortBySalary sbs = new SortBySalary();
List emps = new List();
emps.Add(new Employee()
(id = 123, name = "Tom Phelps", salary = 20000.00));
emps.Add(new Employee()
(id = 897, name = "Jack Anderson", salary = 40050.50));
emps.Add(new Employee()
(id = 342, name = "Anna Spectre", salary = 31030.89));
emps.Add(new Employee()
(id = 219, name = "Veronica Clarke", salary = 66333.66));
emps.Add(new Employee()
(id = 642, name = "Jessica Williams", salary = 50505.05));
emps.Add(new Employee()
(id = 923, name = "Mike Fonseca", salary = 76543.21));
emps.Sort(sbn);
Console.WriteLine("Sorted Employee List by Names:\n");
DisplayList(emps);
emps.Sort(sbs);
Console.WriteLine("\n\nSorted Employee List by Salaries:\n");
DisplayList(emps);
)
static void DisplayList(List emp)
(
foreach (Employee e in emp)
(
Console.WriteLine("Id: " + e.id + ", Name: " + e.name + ", Salary: " + e.salary);
)
)
)

Ausgabe:

Fazit

Dieser Artikel befasste sich daher eingehend mit dem Sortieren von Sammlungen in C #. Wir haben uns hauptsächlich auf Arrays und Listen konzentriert, da diese beiden auch alle primitiven Typen abdecken. Sobald das Konzept des Sortierens in C # sehr gut verstanden ist, lässt sich das Sortieren leicht in anderen Sammlungen wie Aufzählungen, Wörterbüchern usw. implementieren. Nach Abschluss dieses Artikels wird empfohlen, die MSDN-Dokumentation zu lesen, um weitere Implementierungen des Sortierens in C # zu finden.

Empfohlene Artikel

Dies ist eine Anleitung zum Sortieren in C #. Hier werden die Sortierleistung, Sortierarten wie Array und Liste sowie die Beispiele und die Codeimplementierung erläutert. Sie können sich auch die folgenden Artikel ansehen, um mehr zu erfahren -

  1. Objekte in C #
  2. Zugriffsmodifikatoren in C #
  3. Bubble Sort in Java
  4. Zeiger in C #
  5. Sortierung in Python
  6. String Array in JavaScript
  7. Vergleichbar in Java Beispiel | Erfassungsschnittstelle in Java
  8. Strings Array in C mit Funktionen
  9. Verschiedene Beispiele für Sammlungen in C #