Introduktion til sortering i C #

Sortering i c # er processen med at arrangere indholdet af en samling i en bestemt rækkefølge. En samling kan være en matrix, en liste eller en hvilken som helst anden datagruppe. Samlingen kan indeholde elementer af enkle typer såvel som komplekse typer. En simpel type kan være en samling heltal, strenge, flydende numre osv. En kompleks type kan være en samling af objekter af brugerdefinerede typer såsom Medarbejder, Student osv. Komplekse typer er mere end ofte indlejrede, hvilket betyder objekterne kan have flere attributter.

eksempler

  • Enkel type
    • Heltalssamling - (1, 2, 3, 4, 5)
    • Strengsamling - ("Mark", "Jamie", "Anna")
  • Kompleks type
    • ((Navn: “Mark”, medarbejder-id: “123”, kontor: “London”),
      (Navn: “Jane”, medarbejder-id: “456”, kontor: “NY”),
      (Navn: “Annie”, medarbejder-id: “789”, kontor: “Sydney”))

C # har leveret indbyggede metoder til sortering af samlinger. Det være sig en Array, Liste eller en hvilken som helst generisk samling, C # Sort () -metoden kan sortere den baseret på den medfølgende Comparer. Internt anvender .Net-implementeringen Quicksort-algoritmen til at sortere samlinger i C #. Vi vil diskutere mere om dette i de efterfølgende sektioner af artiklen.

Hvordan sorteres der i C #?

Som nævnt tidligere bruger .Net-rammen Quicksort-fremgangsmåden til at sortere elementerne i en C # -samling. Så hvad er quicksort?

Quicksort følger en splittelse og erobre strategi. Dette betyder, at sorteringsalgoritmen vælger et pivotelement og deler arrayet baseret på pivotelementet. Elementerne, der er mindre end drejepoten, placeres foran den. Elementerne større end drejepladen placeres efter det. Dette sikrer, at pivotelementet sorteres. Arrayet er også opdelt i to - elementer, der er mindre end pivot og elementer, der er større end pivot. Dernæst følger algoritmen den samme tilgang til begge arrays.

En illustration af dette kan ses nedenfor.

Usorteret matrix - 18, 5, 16, 23, 50, 32

Trin 1 (drejning = 32) - 18, 5, 16, 23, 32, 50

Trin 2a
Usorteret matrix - 18, 5, 16, 23
Pivot = 23
Delvist sorteret matrix - 18, 5, 16, 23

Trin 2b
Usorteret matrix - 50
Pivot = 50
Delvist sorteret matrix - 50

Trin 3a
Usorteret matrix - 18, 5, 16
Pivot = 16
Delvist sorteret matrix - 5, 16, 18

Sorteret matrix - 5, 16, 18, 23, 32, 50

Quicksort har således to nøgleprocesser - valg af pivot og opdeling af arrayet. Implementeringerne af algoritmen afhænger af valg af pivot. Det kan enten være det første element eller det sidste eller et vilkårligt tilfældigt element eller medianen for matrixen. Når partitionen er udført, og pivoten er placeret i den rigtige position, opfordres algoritmen rekursivt til de partitionerede arrays, indtil hvert element er sorteret.

Når sorteringen udføres i C #, kommer begrebet stabil og ustabil Quicksort. I en stabil Quicksort, hvis to elementer er ens, bevares deres rækkefølge fra det originale array. Ellers er det i en ustabil quicksort. C # -implementering bruger ustabil Quicksort.

Typer af sortering i C #

I dette afsnit af artiklen vil vi hovedsageligt fokusere på to typer samlinger i C # - Arrays og lister. Vi ville dybt dykke ned i, hvordan C # sorterer matrixerne og listerne. Det næste afsnit forsøger at forklare det med nogle eksempler.

1. Sortering af en matrix i C #

Lad os se på de forskellige måder, hvorpå vi kan sortere en matrix i C #.

en. Brug af standardkomparator

Dette er standardmetoden Sort (). Hvis der ikke eksplicit gives nogen komparator til metoden, bruger C # den stigende rækkefølge til at arrangere elementerne.

Kode:

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

Produktion:

b. Brug af tilpasset komparator

Vi kan også levere vores egen tilpassede komparator til metoden Sort (). Dette instruerer C # -kompileren til at bruge den brugerdefinerede sammenligning i stedet for den standardindstillede.

For at oprette en brugerdefineret sammenligning er vi nødt til at implementere Compare () -metoden fra IComparer-interface. Koden herunder viser, hvordan man opretter en sammenligning, der vil sortere elementerne i faldende rækkefølge.

Vi oprettede en klasse, arvet den fra IComparer-grænsefladen, implementerede metoden Compare () og overstyr den for at sammenligne elementerne i faldende rækkefølge.

Kode:

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

Produktion:

c. Brug af nøgleværdipar

C # giver også en måde at sortere en matrix ved hjælp af nøgleværdier fra en anden matrix. Eksemplet nedenfor har nøgleværdipar med fornavne og efternavne på mennesker. Vi sorterer dem efter både for- og efternavne ved hjælp af metoden Sorter ().

Kode:

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

Produktion:

2. Sortering af en liste i C #

Lad os se på de forskellige måder, hvorpå vi kan sortere en liste i C #.

Bemærk - For at bruge lister i C #, herunder biblioteket System.Collections.Generic.

en. Brug af standardkomparator

Dette er standard sorteringsmetoden. Hvis der ikke eksplicit gives nogen sammenligning til metoden, bruger c # den stigende rækkefølge til at arrangere elementerne.

Kode:

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

Produktion:

b. Brug af tilpasset komparator

Vi kan også levere vores egen tilpassede sammenligning til sorteringsmetoden. Dette instruerer c # -kompilatoren til at bruge den tilpassede sammenligning i stedet for den standardkomponenter.

For at oprette en brugerdefineret sammenligning er vi nødt til at implementere Compare () -metoden fra IComparer-interface. Koden herunder viser, hvordan man opretter en sammenligning, der vil sortere elementerne i faldende rækkefølge.

Vi oprettede en klasse, arvet den fra IComparer-grænsefladen, implementerede metoden Compare () og overstyr den for at sammenligne elementerne i faldende rækkefølge.

Kode:

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

Produktion:

Sortering af komplekse listetyper

Komplekse listetyper er brugerdefinerede lister. For at være mere præcise er de lister over objekter i brugerdefinerede klasser. Når de er brugerdefinerede, er objekterne en blanding af forskellige primitive typer. Det er vanskeligt at sortere en kompleks listetype. C # -kompiler forventer, at hver kompleks klasse skal arve fra IComparable interface og definere metoden CompareTo (). Denne metode indeholder instruktionerne om, hvordan man sammenligner elementerne i listen til sortering.

I eksemplet nedenfor definerer vi en brugerdefineret klasse af medarbejdere og sorterer medarbejderobjekterne baseret på deres ID'er.

Eksempel 1

Kode:

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

Produktion:

Nu er det åbenlyse spørgsmål, der kommer til at tænke på, at hvad nu hvis vi vil sortere objekterne i medarbejderklassen baseret på en anden ejendom? Dette er muligt. Vi bliver nødt til at implementere IComparer-interface. Lad os se på eksemplet nedenfor for at forstå.

Eksempel 2

Kode:

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

Produktion:

Konklusion

Så denne artikel dækkede grundigt, hvordan man sorterer samlinger i C #. Vi fokuserede stort set på matriser og lister, da disse to også dækker alle de primitive typer. Når først begrebet Sortering i C # er godt forstået, bliver det let at implementere sortering i andre samlinger, såsom Opregninger, ordbøger osv. Når denne artikel er afsluttet, anbefales det at udforske MSDN-dokumentationen for flere implementeringer af sortering i C #.

Anbefalede artikler

Dette er en guide til sortering i C #. Her diskuterer vi sorteringsydelse, typer sortering såsom array og liste sammen med eksemplerne og kodeimplementering. Du kan også se på de følgende artikler for at lære mere -

  1. Objekter i C #
  2. Adgang modifikatorer i C #
  3. Bubble Sort i Java
  4. Pegere i C #
  5. Sorterer i Python
  6. String Array i JavaScript
  7. Sammenlignelig i Java-eksempel | Samling interface i Java
  8. Strenge Array i C med funktioner
  9. Forskellige eksempler på samlinger i C #

Kategori: