Introduktion till sortering i C #

Att sortera i c # är processen för att ordna innehållet i en samling i en specifik ordning. En samling kan vara en matris, en lista eller någon annan datagrupp. Samlingen kan innehålla element av enkla typer såväl som komplexa typer. En enkel typ kan vara en samling heltal, strängar, flytpunktsnummer etc. En komplex typ kan vara en samling av objekt av användardefinierade typer som anställd, student etc. Komplexa typer är mer än ofta kapslade, vilket betyder objekten kan ha flera attribut.

exempel

  • Enkel typ
    • Heltalssamling - (1, 2, 3, 4, 5)
    • Strängsamling - ("Mark", "Jamie", "Anna")
  • Komplex typ
    • ((Namn: “Mark”, anställds id: “123”, kontor: “London”),
      (Namn: “Jane”, anställds id: “456”, kontor: “NY”),
      (Namn: “Annie”, anställds id: “789”, kontor: “Sydney”))

C # har tillhandahållit inbyggda metoder för att sortera samlingar. Vare sig det är en Array, List eller vilken generisk samling som helst, kan C # Sort () -metoden sortera det baserat på den medföljande Comparer. Internt använder implementeringen av .Net Quicksort-algoritmen för att sortera samlingar i C #. Vi kommer att diskutera mer om detta i följande avsnitt av artikeln.

Hur sortering utförs i C #?

Som nämnts tidigare använder .Net-ramverket Quicksort-metoden för att sortera elementen i en C # -samling. Så vad är quicksort?

Quicksort följer en splittring och erövringsstrategi. Detta betyder att sorteringsalgoritmen väljer ett pivotelement och delar upp matrisen baserat på pivotelementet. Elementen som är mindre än pivoten placeras före den. Elementen större än pivoten placeras efter den. Detta säkerställer att pivotelementet sorteras. Dessutom är matrisen uppdelad i två element mindre än pivot och element större än pivot. Därefter följer algoritmen samma tillvägagångssätt för båda arrayerna.

En illustration av detta kan ses nedan.

Osorterad matris - 18, 5, 16, 23, 50, 32

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

Steg 2a
Osorterad matris - 18, 5, 16, 23
Pivot = 23
Delvis sorterad matris - 18, 5, 16, 23

Steg 2b
Osorterad matris - 50
Pivot = 50
Delvis sorterad matris - 50

Steg 3a
Osorterad matris - 18, 5, 16
Pivot = 16
Delvis sorterad matris - 5, 16, 18

Sorterad matris - 5, 16, 18, 23, 32, 50

Således har Quicksort två viktiga processer - att välja pivot och partitionera matrisen. Implementeringarna av algoritmen beror på valet av pivoten. Det kan vara antingen det första elementet, eller det sista, eller något slumpmässigt element, eller medianen för matrisen. När partitionen är klar och pivoten är placerad i rätt position kallas algoritmen rekursivt för de partitionerade matriserna, tills varje element är sorterat.

När sorteringen görs i C #, kommer konceptet med stabil och instabil Quicksort. Om två element är lika i en stabil Quicksort bevaras deras ordning från den ursprungliga matrisen. Annars är det i en instabil kvicksort. C # -implementering använder instabil Quicksort.

Typer av sortering i C #

I det här avsnittet av artikeln fokuserar vi huvudsakligen på två typer av samlingar i C # - Arrays and Lists. Vi skulle djupt dyka in i hur C # sorterar matriser och listor. Nästa avsnitt skulle försöka förklara det med några exempel.

1. Sortera en matris i C #

Låt oss titta på de olika sätten på vilka vi kan sortera en matris i C #.

a. Använda standardkompararer

Detta är standardmetoden Sortera (). Om ingen jämförare uttryckligen överförs till metoden, använder C # den stigande ordningen för att ordna elementen.

Koda:

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. Använda anpassad jämförelse

Vi kan också tillhandahålla vår egen anpassade jämförelse till metoden Sortera (). Detta skulle instruera C # -kompileraren att använda den anpassade jämföraren istället för den standard.

För att skapa en anpassad jämförare måste vi implementera metoden Compare () från IComparer-gränssnittet. Koden nedan visar hur man skapar en jämförare som skulle sortera elementen i fallande ordning.

Vi skapade en klass, ärvde den från IComparer-gränssnittet, implementerade metoden Compare () och överskottade den för att jämföra elementen i fallande ordning.

Koda:

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. Använda nyckelvärdespar

C # ger också ett sätt att sortera en matris med hjälp av nyckelvärden från en annan matris. Exemplet nedan har nyckelvärdespar med förnamn och efternamn på personer. Vi sorterade dem efter både för- och efternamn med metoden Sortera ().

Koda:

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. Sortera en lista i C #

Låt oss titta på de olika sätten på vilka vi kan sortera en lista i C #.

Obs - För att använda listor i C #, inklusive biblioteket System.Collections.Generic.

a. Använda standardkompararer

Detta är metoden för sortering (). om ingen jämförare överförs uttryckligen till metoden, använder c # den stigande ordningen för att ordna elementen.

Koda:

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. Använda anpassad jämförelse

Vi kan också tillhandahålla vår egen anpassade jämförelse till sorteringsmetoden. Detta skulle instruera c # -kompilatorn att använda den anpassade jämföraren istället för standardkomponenten.

För att skapa en anpassad jämförare måste vi implementera metoden Compare () från IComparer-gränssnittet. Koden nedan visar hur man skapar en jämförare som skulle sortera elementen i fallande ordning.

Vi skapade en klass, ärvde den från IComparer-gränssnittet, implementerade metoden Compare () och överskottade den för att jämföra elementen i fallande ordning.

Koda:

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:

Sortera komplexa liststyper

Komplexa listetyper är användardefinierade listor. För att vara mer exakt är de listor med objekt i användardefinierade klasser. Eftersom de är användardefinierade är objekten en blandning av olika primitiva typer. Det är svårt att sortera en komplex listtyp. C # -kompilerare förväntar sig att varje komplex klass ska ärva från IComparable-gränssnittet och definiera metoden CompareTo (). Den här metoden innehåller instruktioner för hur du kan jämföra elementen i listan för sortering.

I exemplet nedan definierar vi en användardefinierad klass av anställda och sorterar anställdobjekten utifrån deras ID.

Exempel 1

Koda:

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 är den uppenbara frågan som tänker på att om vi vill sortera föremålen för anställdsklassen baserat på någon annan egendom? Det här är möjligt. Vi måste implementera IComparer-gränssnittet. Låt oss ta en titt på exemplet nedan för att förstå.

Exempel 2

Koda:

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:

Slutsats

Så den här artikeln omfattade djupgående hur man sorterar samlingar i C #. Vi fokuserade huvudsakligen på matriser och listor eftersom dessa två också täcker alla primitiva typer. När väl begreppet sortering i C # är mycket väl förstått, blir det enkelt att implementera sortering i andra samlingar, såsom uppräkningar, ordböcker, etc.

Rekommenderade artiklar

Detta är en guide till sortering i C #. Här diskuterar vi sorteringsprestanda, sorteringstyper som array och lista tillsammans med exemplen och kodimplementering. Du kan också titta på följande artiklar för att lära dig mer -

  1. Objekt i C #
  2. Få åtkomst till modifierare i C #
  3. Bubble Sort i Java
  4. Pekare i C #
  5. Sorterar i Python
  6. String Array i JavaScript
  7. Jämförbart i Java-exempel | Samlingsgränssnitt i Java
  8. Strängar Array i C med funktioner
  9. Olika exempel på samlingar i C #

Kategori: