Úvod do třídění v C #

Třídění v c # je proces uspořádání obsahu kolekce v určitém pořadí. Kolekce může být pole, seznam nebo jakákoli jiná datová skupina. Kolekce může obsahovat prvky jednoduchých i složitých typů. Jednoduchým typem může být kolekce celých čísel, řetězců, čísel s plovoucí desetinnou čárkou atd. Složitým typem může být kolekce objektů uživatelem definovaných typů, jako je zaměstnanec, student atd. Složité typy jsou více než často vnořeny, což znamená objekty mohou mít více atributů.

Příklady

  • Jednoduchý typ
    • Celá kolekce - (1, 2, 3, 4, 5)
    • Kolekce řetězců - („Mark“, „Jamie“, „Anna“)
  • Složitý typ
    • ((Jméno: „Mark“, Id zaměstnance: „123“, Office: „London“),
      (Jméno: „Jane“, Id zaměstnance: „456“, Kancelář: „NY“),
      (Jméno: “Annie”, Id zaměstnance: “789”, Kancelář: “Sydney”))

C # poskytuje zabudované metody třídění kolekcí. Ať už je to pole, seznam nebo jakákoli obecná kolekce, metoda C # Sort () ji může třídit na základě poskytnutého porovnávače. Interně implementace .Net používá algoritmus Quicksort k třídění kolekcí v C #. Budeme o tom diskutovat v následujících částech článku.

Jak se třídění provádí v C #?

Jak bylo uvedeno výše, framework .Net používá k seřazení prvků v kolekci C # přístup Quicksort. Co je tedy quicksort?

Quicksort se řídí rozdělenou a dobývající strategií. To znamená, že třídicí algoritmus vybere otočný prvek a rozdělí pole na základě otočného prvku. Prvky menší než čep jsou umístěny před ním. Prvky větší než čep jsou umístěny za ním. Tím je zajištěno třídění otočného prvku. Také pole je rozděleno na dva - prvky menší než pivot a prvky větší než pivot. Dále algoritmus sleduje stejný přístup pro obě pole.

Ilustrace tohoto je vidět níže.

Netříděné pole - 18, 5, 16, 23, 50, 32

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

Krok 2a
Netříděné pole - 18, 5, 16, 23
Pivot = 23
Částečně tříděné pole - 18, 5, 16, 23

Krok 2b
Netříděné pole - 50
Pivot = 50
Částečně tříděné pole - 50

Krok 3a
Netříděné pole - 18, 5, 16
Pivot = 16
Částečně tříděné pole - 5, 16, 18

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

Proto má Quicksort dva klíčové procesy - výběr pivotu a rozdělení pole. Implementace algoritmu závisí na výběru pivotu. Může to být buď první prvek, nebo poslední, nebo libovolný náhodný prvek, nebo medián pole. Jakmile je oddíl vytvořen a pivot je umístěn na správné pozici, je algoritmus rekurzivně vyvolán pro rozdělená pole, dokud není každý prvek seřazen.

Když se třídění provádí v C #, přichází koncept stabilní a nestabilní Quicksort. Ve stabilní Quicksort, pokud jsou dva prvky stejné, jejich pořadí z původního pole je zachována. Jinak je to v nestabilním rychlém sortimentu. Implementace C # používá nestabilní Quicksort.

Typy třídění v C #

V této části článku bychom se zaměřili hlavně na dva typy sbírek v C # - Arrays and Lists. Podrobně bychom se ponořili do toho, jak C # třídí pole a seznamy. Následující část by se pokusila to vysvětlit několika příklady.

1. Třídění pole v C #

Podívejme se na různé způsoby, jak můžeme třídit pole v C #.

A. Pomocí výchozího porovnávače

Toto je výchozí metoda Sort (). Pokud do metody není explicitně předán žádný porovnávač, použije C # k uspořádání prvků vzestupné pořadí.

Kód:

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

Výstup:

b. Použití vlastního porovnávače

Můžeme také poskytnout vlastní vlastní metodu Porovnání s metodou Sort (). To by instruovalo kompilátor C #, aby používal vlastní porovnávač místo výchozího.

Chcete-li vytvořit vlastní komparátor, musíme implementovat metodu Compare () z rozhraní IComparer. Následující kód ukazuje, jak vytvořit komparátor, který by třídil prvky v sestupném pořadí.

Vytvořili jsme třídu, zdědili ji z rozhraní IComparer, implementovali metodu Compare () a přepracovali ji pro porovnání prvků v sestupném pořadí.

Kód:

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

Výstup:

C. Použití párů klíč-hodnota

C # také poskytuje způsob třídění jednoho pole pomocí klíčových hodnot z jiného pole. Následující příklad obsahuje páry klíč-hodnota křestních jmen a příjmení lidí. Řadili jsme je podle křestního jména a příjmení pomocí metody Sort ().

Kód:

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

Výstup:

2. Třídění seznamu v C #

Podívejme se na různé způsoby, jak můžeme třídit seznam v C #.

Poznámka - Chcete-li používat seznamy v jazyce C #, včetně knihovny System.Collections.Generic.

A. Pomocí výchozího porovnávače

Toto je výchozí metoda sort (). pokud do metody není explicitně předán žádný porovnávač, použije c # k uspořádání prvků vzestupné pořadí.

Kód:

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

Výstup:

b. Použití vlastního porovnávače

Můžeme také poskytnout vlastní vlastní srovnání s metodou sort (). To by instruovalo kompilátor c #, aby používal vlastní porovnávač místo výchozího.

Chcete-li vytvořit vlastní komparátor, musíme implementovat metodu Compare () z rozhraní IComparer. Následující kód ukazuje, jak vytvořit komparátor, který by třídil prvky v sestupném pořadí.

Vytvořili jsme třídu, zdědili ji z rozhraní IComparer, implementovali metodu Compare () a přepracovali ji pro porovnání prvků v sestupném pořadí.

Kód:

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

Výstup:

Třídění komplexních typů seznamů

Typy složitých seznamů jsou seznamy definované uživatelem. Přesněji řečeno, jedná se o seznamy objektů uživatelem definovaných tříd. Protože jsou uživatelem definované, jsou objekty směsí různých primitivních typů. Je obtížné třídit složitý typ seznamu. Kompilátor C # očekává, že každá složitá třída zdědí z rozhraní IComparable a definuje metodu CompareTo (). Tato metoda obsahuje pokyny, jak porovnat prvky seznamu pro třídění.

V níže uvedeném příkladu definujeme uživatelem definovanou třídu zaměstnanců a třídíme objekty zaměstnance podle jejich ID.

Příklad č. 1

Kód:

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

Výstup:

Nyní je zřejmá otázka, která přichází na mysl, že co když chceme třídit objekty třídy Zaměstnanci podle jiného majetku? To je možné. Budeme muset implementovat rozhraní IComparer. Pojďme se podívat na níže uvedený příklad, abychom pochopili.

Příklad č. 2

Kód:

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

Výstup:

Závěr

Tento článek se tedy zabýval hloubkou toho, jak třídit sbírky v C #. Zaměřili jsme se hlavně na pole a seznamy, protože tyto dva zahrnují také všechny primitivní typy. Jakmile je koncept třídění v C # velmi dobře pochopen, je snadné implementovat třídění v jiných kolekcích, jako jsou výčty, slovníky atd. Po dokončení tohoto článku se doporučuje prozkoumat dokumentaci MSDN pro další implementace třídění v C #.

Doporučené články

Toto je průvodce tříděním v C #. Zde diskutujeme výkon třídění, typy třídění, jako je pole a seznam, spolu s příklady a implementací kódu. Další informace naleznete také v následujících článcích -

  1. Objekty v C #
  2. Modifikátory přístupu v C #
  3. Řazení bublin v Javě
  4. Ukazatele v C #
  5. Třídění v Pythonu
  6. Řetězcová pole v JavaScriptu
  7. Srovnatelné v příkladu Java | Sběrné rozhraní v Javě
  8. Řetězcové pole v C s funkcemi
  9. Různé příklady sbírek v C #

Kategorie: