Introduksjon til sortering i C #

Sortering i c # er prosessen med å ordne innholdet i en samling i en bestemt rekkefølge. En samling kan være en matrise, en liste eller en hvilken som helst annen datagruppe. Samlingen kan inneholde elementer av enkle typer så vel som komplekse typer. En enkel type kan være en samling av heltall, strenger, flytende tall osv. En kompleks type kan være en samling av objekter av brukerdefinerte typer som Ansatt, Student osv. Komplekse typer er mer enn ofte hekket, noe som betyr objektene kan ha flere attributter.

eksempler

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

C # har gitt innebygde metoder for å sortere samlinger. Det være seg en Array, List eller en hvilken som helst generisk samling, C # Sort () -metoden kan sortere den basert på den medfølgende Comparer. Internt bruker .Net-implementeringen Quicksort-algoritmen til å sortere samlinger i C #. Vi vil diskutere mer om dette i påfølgende deler av artikkelen.

Hvordan sortering utføres i C #?

Som nevnt tidligere bruker .Net-rammen Quicksort-tilnærmingen for å sortere elementene i en C # -samling. Så, hva er quicksort?

Quicksort følger en splittelse og erobre strategi. Dette betyr at sorteringsalgoritmen velger et pivotelement og deler arrayet basert på pivotelementet. Elementene som er mindre enn pivoten, plasseres foran den. Elementene større enn pivoten plasseres etter den. Dette sikrer at pivotelementet blir sortert. Dessuten er matrisen delt i to - elementer som er mindre enn pivot og elementer som er større enn pivotten. Deretter følger algoritmen den samme tilnærmingen for begge matriser.

En illustrasjon av dette kan sees nedenfor.

Usortert matrise - 18, 5, 16, 23, 50, 32

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

Trinn 2a
Usortert matrise - 18, 5, 16, 23
Pivot = 23
Delvis sortert matrise - 18, 5, 16, 23

Trinn 2b
Usortert matrise - 50
Pivot = 50
Delvis sortert matrise - 50

Trinn 3a
Usortert matrise - 18, 5, 16
Pivot = 16
Delvis sortert matrise - 5, 16, 18

Sortert matrise - 5, 16, 18, 23, 32, 50

Dermed har Quicksort to viktige prosesser - valg av pivot og partisjon av matrisen. Implementeringene av algoritmen avhenger av valg av pivotten. Det kan være enten det første elementet, eller det siste, eller et hvilket som helst tilfeldig element, eller medianen til matrisen. Når partisjonen er fullført og pivoten er plassert i riktig posisjon, kalles algoritmen rekursivt for de partisjonerte matriser, inntil hvert element er sortert.

Når sortering gjøres i C #, kommer konseptet med stabil og ustabil Quicksort. Hvis to elementer er like i en stabil Quicksort, bevares deres rekkefølge fra den opprinnelige matrisen. Ellers er den i en ustabil quicksort. C # implementering bruker ustabil Quicksort.

Typer sortering i C #

I denne delen av artikkelen fokuserer vi hovedsakelig på to typer samlinger i C # - Arrays and Lists. Vi ville dypdykk i hvordan C # sorterer matriser og lister. Den neste delen vil prøve å forklare det med noen eksempler.

1. Sortere en matrise i C #

La oss se på de forskjellige måtene vi kan sortere en matrise i C #.

en. Bruker standard sammenligning

Dette er standard sorteringsmetode. Hvis ingen Comparer eksplisitt blir gitt til metoden, bruker C # stigende rekkefølge for å ordne elementene.

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

Produksjon:

b. Bruker egendefinert sammenligning

Vi kan også tilby vår egen tilpassede Comparer til Sorter () -metoden. Dette vil instruere C # -kompilatoren om å bruke den tilpassede kompareren i stedet for standard.

For å lage en tilpasset sammenligning, må vi implementere Compare () -metoden fra IComparer-grensesnittet. Koden nedenfor viser hvordan du oppretter en sammenligning som vil sortere elementene i synkende rekkefølge.

Vi opprettet en klasse, arvet den fra IComparer-grensesnittet, implementerte metoden Compare () og overstyr den for å sammenligne elementene i synkende rekkefø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");
)
)
)

Produksjon:

c. Bruke nøkkelverdipar

C # gir også en måte å sortere en matrise ved å bruke nøkkelverdier fra en annen matrise. Eksemplet nedenfor har nøkkelverdipar med fornavn og etternavn på personer. Vi ville sortere dem etter både for- og etternavn ved å bruke Sorter () -metoden.

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

Produksjon:

2. Sortere en liste i C #

La oss se på de forskjellige måtene vi kan sortere en liste i C #.

Merk - For å bruke lister i C #, inkludert biblioteket System.Collections.Generic.

en. Bruker standard sammenligning

Dette er standard sorteringsmetode. hvis ingen sammenligning blir eksplisitt gitt til metoden, bruker c # stigende rekkefølge for å ordne elementene.

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

Produksjon:

b. Bruker egendefinert sammenligning

Vi kan også tilby vår egen tilpassede sammenligning til sorteringsmetoden. Dette vil instruere c # -kompilatoren til å bruke den tilpassede kompareren i stedet for standard.

For å lage en tilpasset sammenligning, må vi implementere Compare () -metoden fra IComparer-grensesnittet. Koden nedenfor viser hvordan du oppretter en sammenligning som vil sortere elementene i synkende rekkefølge.

Vi opprettet en klasse, arvet den fra IComparer-grensesnittet, implementerte Compare () -metoden og overstyr den for å sammenligne elementene i synkende rekkefø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");
)
)
)

Produksjon:

Sortering av komplekse listetyper

Komplekse listetyper er brukerdefinerte lister. For å være mer presise, er de lister over objekter fra brukerdefinerte klasser. Å være brukerdefinerte, objektene er en blanding av forskjellige primitive typer. Det er vanskelig å sortere en sammensatt listetype. C # -kompilator forventer at hver komplekse klasse skal arve fra det IComparable grensesnittet og definere metoden CompareTo (). Denne metoden inneholder instruksjonene for hvordan du kan sammenligne elementene i listen for sortering.

I eksemplet nedenfor definerer vi en brukerdefinert klasse medarbeidere og sorterer de ansatte gjenstandene basert på ID-ene deres.

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

Produksjon:

Nå, det åpenbare spørsmålet som kommer opp i tankene er at hva om vi ønsker å sortere gjenstandene til arbeidstakerklasse basert på en annen eiendom? Dette er mulig. Vi må implementere IComparer-grensesnittet. La oss se på eksemplet nedenfor for å 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);
)
)
)

Produksjon:

Konklusjon

Så denne artikkelen dekket grundig hvordan du sorterer samlinger i C #. Vi fokuserte stort sett på Arrays og Lists siden disse to dekker alle de primitive typene også. Når begrepet Sortering i C # er veldig godt forstått, blir det enkelt å implementere sortering i andre samlinger som Enumerations, Dictionaries, etc. Etter å ha fullført denne artikkelen, anbefales det å utforske MSDN-dokumentasjonen for flere implementeringer av Sorting in C #.

Anbefalte artikler

Dette er en guide til sortering i C #. Her diskuterer vi sorteringsytelse, typer sortering som matrise og liste sammen med eksemplene og kodeimplementering. Du kan også se på følgende artikler for å lære mer -

  1. Objekter i C #
  2. Få tilgang til modifikatorer i C #
  3. Bubble Sort i Java
  4. Pekere i C #
  5. Sorterer i Python
  6. String Array i JavaScript
  7. Sammenlignbar i Java-eksempel | Samlingsgrensesnitt i Java
  8. Strenger Array i C med funksjoner
  9. Ulike eksempler på samlinger i C #