Inleiding tot sorteren in C #

Sorteren in c # is het proces waarbij de inhoud van een verzameling in een specifieke volgorde wordt gerangschikt. Een verzameling kan een array, een lijst of een andere gegevensgroep zijn. De verzameling kan elementen van zowel eenvoudige als complexe typen bevatten. Een eenvoudig type kan een verzameling gehele getallen, tekenreeksen, drijvende-kommagetallen, enz. Zijn. Een complex type kan een verzameling objecten van door de gebruiker gedefinieerde typen zijn, zoals Werknemer, Student, etc. Complexe typen zijn meer dan vaak genest, wat betekent de objecten kunnen meerdere attributen hebben.

Voorbeelden

  • Eenvoudig type
    • Gehele verzameling - (1, 2, 3, 4, 5)
    • Stringcollectie - ("Mark", "Jamie", "Anna")
  • Complex type
    • ((Naam: "Mark", Werknemers-ID: "123", Kantoor: "Londen"),
      (Naam: "Jane", werknemers-ID: "456", kantoor: "NY"),
      (Naam: "Annie", Werknemers-ID: "789", Kantoor: "Sydney"))

C # biedt ingebouwde methoden om collecties te sorteren. Of het nu een array, lijst of een generieke verzameling is, de methode C # Sort () kan deze sorteren op basis van de meegeleverde Comparer. Intern gebruikt de .Net-implementatie het Quicksort-algoritme om collecties in C # te sorteren. We zullen hierover meer bespreken in de volgende secties van het artikel.

Hoe sorteren wordt uitgevoerd in C #?

Zoals eerder vermeld, gebruikt het .Net-framework de Quicksort-aanpak om de elementen in een C # -collectie te sorteren. Wat is quicksort?

Quicksort volgt een verdeel en heers strategie. Dit betekent dat het sorteeralgoritme een draai-element selecteert en de array verdeelt op basis van het draai-element. De elementen die kleiner zijn dan de pivot worden ervoor geplaatst. De elementen die groter zijn dan het draaipunt worden erachter geplaatst. Dit zorgt ervoor dat het pivot-element wordt gesorteerd. De array is ook verdeeld in twee elementen - kleiner dan de pivot en elementen groter dan de pivot. Vervolgens volgt het algoritme dezelfde benadering voor beide arrays.

Een illustratie hiervan is hieronder te zien.

Niet-gesorteerde array - 18, 5, 16, 23, 50, 32

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

Stap 2a
Niet-gesorteerde array - 18, 5, 16, 23
Pivot = 23
Gedeeltelijk gesorteerde array - 18, 5, 16, 23

Stap 2b
Niet-gesorteerde array - 50
Pivot = 50
Gedeeltelijk gesorteerde array - 50

Stap 3a
Niet-gesorteerde array - 18, 5, 16
Pivot = 16
Gedeeltelijk gesorteerde array - 5, 16, 18

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

Quicksort kent dus twee sleutelprocessen: de pivot selecteren en de array partitioneren. De implementaties van het algoritme zijn afhankelijk van de selectie van het draaipunt. Dit kan het eerste element zijn, of het laatste, of een willekeurig element, of de mediaan van de array. Zodra de partitie is voltooid en de pivot op de juiste positie is geplaatst, wordt het algoritme recursief opgeroepen voor de gepartitioneerde arrays, totdat elk element is gesorteerd.

Wanneer het sorteren in C # wordt gedaan, komt er het concept van stabiele en onstabiele Quicksort. In een stabiele Quicksort blijft de volgorde van de oorspronkelijke array behouden als twee elementen gelijk zijn. Anders is het in een onstabiele quicksort. C # implementatie gebruikt onstabiele Quicksort.

Soorten sortering in C #

In dit gedeelte van het artikel richten we ons voornamelijk op twee soorten collecties in C # - Arrays and Lists. We zouden diep duiken in hoe C # de arrays en lijsten sorteert. In het volgende gedeelte wordt geprobeerd dit uit te leggen met enkele voorbeelden.

1. Een array sorteren in C #

Laten we eens kijken naar de verschillende manieren waarop we een array in C # kunnen sorteren.

een. Standaardvergelijker gebruiken

Dit is de standaardmethode Sort (). Als er geen Comparer expliciet aan de methode wordt doorgegeven, gebruikt C # de oplopende volgorde om de elementen te rangschikken.

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");
)
)
)

Output:

b. Custom Comparer gebruiken

We kunnen ook onze eigen aangepaste vergelijking met de methode Sort () bieden. Dit zou de C # compiler instrueren om de aangepaste vergelijker te gebruiken in plaats van de standaardvergelijker.

Om een ​​aangepaste vergelijking te maken, moeten we de methode Compare () van de IComparer-interface implementeren. De onderstaande code laat zien hoe u een vergelijker maakt die de elementen in aflopende volgorde sorteert.

We hebben een klasse gemaakt, deze geërfd van de IComparer-interface, de methode Compare () geïmplementeerd en vervangen om de elementen in aflopende volgorde te vergelijken.

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");
)
)
)

Output:

c. Sleutel / waarde-paren gebruiken

C # biedt ook een manier om een ​​array te sorteren met sleutelwaarden van een andere array. Het onderstaande voorbeeld bevat sleutel / waarde-paren van voor- en achternamen van personen. We sorteren ze op zowel voor- als achternaam met de methode Sort ().

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));
)
)
)

Output:

2. Een lijst sorteren in C #

Laten we eens kijken naar de verschillende manieren waarop we een lijst in C # kunnen sorteren.

Opmerking - Om lijsten in C # te gebruiken, inclusief de bibliotheek System.Collections.Generic.

een. Standaardvergelijker gebruiken

Dit is de standaardmethode sort (). als er geen vergelijking expliciet aan de methode wordt doorgegeven, gebruikt c # de oplopende volgorde om de elementen te rangschikken.

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");
)
)
)

Output:

b. Custom Comparer gebruiken

We kunnen ook onze eigen aangepaste vergelijker van de methode sort () bieden. Dit zou de c # compiler instrueren om de aangepaste vergelijker te gebruiken in plaats van de standaardvergelijker.

Om een ​​aangepaste vergelijking te maken, moeten we de methode Compare () van de IComparer-interface implementeren. De onderstaande code laat zien hoe u een vergelijker maakt die de elementen in aflopende volgorde sorteert.

We hebben een klasse gemaakt, deze geërfd van de IComparer-interface, de methode Compare () geïmplementeerd en vervangen om de elementen in aflopende volgorde te vergelijken.

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");
)
)
)

Output:

Complexe lijsttypen sorteren

Complexe lijsttypen zijn door de gebruiker gedefinieerde lijsten. Om precies te zijn, het zijn lijsten met objecten van door de gebruiker gedefinieerde klassen. Omdat ze door de gebruiker zijn gedefinieerd, zijn de objecten een mix van verschillende primitieve typen. Het is moeilijk om een ​​complex lijsttype te sorteren. C # compiler verwacht dat elke complexe klasse zal erven van de IComparable interface en de methode CompareTo () definieert. Deze methode bevat de instructies voor het vergelijken van de elementen van de lijst voor sorteren.

In het onderstaande voorbeeld definiëren we een door de gebruiker gedefinieerde klasse werknemers en sorteren we de werknemerobjecten op basis van hun ID's.

Voorbeeld 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);
)
)
)

Output:

Nu, de voor de hand liggende vraag die in me opkomt, is dat wat als we de objecten van Werknemersklasse willen sorteren op basis van een andere eigenschap? Dit is mogelijk. We zouden de IComparer-interface moeten implementeren. Laten we het onderstaande voorbeeld bekijken om het te begrijpen.

Voorbeeld 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);
)
)
)

Output:

Conclusie

Dus dit artikel ging diep in op hoe je collecties in C # kunt sorteren. We hebben ons vooral gericht op arrays en lijsten, omdat deze twee ook alle primitieve typen omvatten. Als het concept van Sorteren in C # eenmaal heel goed is begrepen, wordt het gemakkelijk om sorteren in andere collecties zoals Tellingen, Woordenboeken, etc. te implementeren. Na het voltooien van dit artikel, wordt het aanbevolen om de MSDN-documentatie te verkennen voor meer implementaties van Sorteren in C #.

Aanbevolen artikelen

Dit is een gids voor sorteren in C #. Hier bespreken we de sorteerprestaties, soorten sortering zoals array en lijst, samen met de voorbeelden en code-implementatie. U kunt ook de volgende artikelen bekijken voor meer informatie -

  1. Objecten in C #
  2. Toegang tot modificaties in C #
  3. Bubble Sort in Java
  4. Aanwijzers in C #
  5. Sorteren in Python
  6. String Array in JavaScript
  7. Vergelijkbaar in Java Voorbeeld | Collectie-interface in Java
  8. Strings Array in C met functies
  9. Verschillende voorbeelden van collecties in C #