Úvod do triedenia v jazyku C #

Triedenie v c # je proces usporiadania obsahu zbierky v konkrétnom poradí. Zbierka môže byť pole, zoznam alebo akákoľvek iná skupina údajov. Zbierka môže obsahovať prvky jednoduchých aj komplexných typov. Jednoduchým typom môže byť súbor celých čísel, reťazcov, čísel s plávajúcou desatinnou čiarkou atď. Komplexný typ môže byť súbor objektov užívateľsky definovaných typov, ako sú Zamestnanec, Študent atď. Komplexné typy sú viac ako často vnorené, čo znamená objekty môžu mať viac atribútov.

Príklady

  • Jednoduchý typ
    • Celočíselná zbierka - (1, 2, 3, 4, 5)
    • Zbierka reťazcov - („Mark“, „Jamie“, „Anna“)
  • Komplexný typ
    • ((Meno: ‚Mark ', Id zamestnanca:“ 123 ”, Kancelária:“ London ”),
      (Meno: „Jane“, Id zamestnanca: „456“, Kancelária: „NY“),
      (Meno: “Annie”, Id zamestnanca: “789”, Kancelária: “Sydney”))

C # poskytuje zabudované metódy triedenia kolekcií. Nech už je to pole, zoznam alebo akákoľvek generická zbierka, metóda C # Sort () ju môže usporiadať podľa poskytnutého porovnávača. Interne implementácia .Net používa algoritmus Quicksort na zoradenie kolekcií v jazyku C #. O tom budeme diskutovať v nasledujúcich častiach článku.

Ako sa triedenie vykonáva v C #?

Ako už bolo uvedené, rámec .Net používa prístup Quicksort na zoradenie prvkov v kolekcii C #. Čo je to skratka?

Quicksort sa riadi rozdelenou a dobývajúcou stratégiou. To znamená, že triediaci algoritmus vyberie otočný prvok a rozdelí pole na základe otočného prvku. Prvky menšie ako čap sú umiestnené pred ním. Za ním sú umiestnené prvky väčšie ako čap. To zaisťuje, že otočný prvok je triedený. Pole je tiež rozdelené na dva - prvky menšie ako čap a prvky väčšie ako čap. Ďalej algoritmus sleduje rovnaký prístup pre obidve polia.

Ilustráciu tohto je možné vidieť nižšie.

Netriedené pole - 18, 5, 16, 23, 50, 32

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

Krok 2a
Netriedené pole - 18, 5, 16, 23
Pivot = 23
Čiastočne triedené pole - 18, 5, 16, 23

Krok 2b
Netriedené pole - 50
Pivot = 50
Čiastočne triedené pole - 50

Krok 3a
Netriedené pole - 18, 5, 16
Pivot = 16
Čiastočne triedené pole - 5, 16, 18

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

Preto má Quicksort dva kľúčové procesy - výber pivotu a rozdelenie polí. Implementácie algoritmu závisia od výberu pivotu. Môže to byť buď prvý prvok, posledný alebo ľubovoľný náhodný prvok alebo medián poľa. Akonáhle je oddiel hotový a pivot je umiestnený na správnom mieste, algoritmus sa rekurzívne volá pre rozdelené polia, až kým nebude každý prvok zoradený.

Keď sa triedenie uskutočňuje v C #, prichádza koncept stabilného a nestabilného Quicksortu. V stabilnom Quicksort, ak sú dva prvky rovnaké, ich poradie z pôvodného poľa sa zachová. Inak je to v nestabilnom rýchlom rade. Implementácia C # používa nestabilný Quicksort.

Druhy triedenia v C #

V tejto časti článku by sme sa zamerali hlavne na dva typy kolekcií v poliach C # - Arrays and Lists. Hlboko by sme sa ponorili do toho, ako C # triedi polia a zoznamy. Nasledujúca časť sa pokúsi vysvetliť niektoré príklady.

1. Triedenie poľa v C #

Pozrime sa na rôzne spôsoby, ako môžeme zoradiť pole v C #.

a. Použitie predvoleného porovnávača

Toto je predvolená metóda triedenia (). Ak do metódy nie je výslovne uvedený žiadny porovnávač, použije C # na usporiadanie prvkov vzostupné poradie.

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ýkon:

b. Použitie vlastného porovnávača

Môžeme tiež poskytnúť náš vlastný spôsob porovnania s metódou Sort (). To by inštruovalo kompilátor C #, aby namiesto vlastného predvoleného porovnávača použil vlastný porovnávač.

Na vytvorenie vlastného porovnávača je potrebné implementovať metódu Compare () z rozhrania IComparer. Nasledujúci kód ukazuje, ako vytvoriť porovnávač, ktorý by usporiadal prvky v zostupnom poradí.

Vytvorili sme triedu, zdedili ju z rozhrania IComparer, implementovali metódu Compare () a prehodnotili ju, aby sme porovnali prvky v zostupnom poradí.

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ýkon:

c. Používanie párov kľúč - hodnota

C # tiež poskytuje spôsob zoradenia jedného poľa pomocou kľúčových hodnôt z iného poľa. V nasledujúcom príklade sú páry kľúč - hodnota s menom a priezviskom. Radili by sme ich podľa priezviska a priezviska pomocou metódy 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ýkon:

2. Triedenie zoznamu v jazyku C #

Pozrime sa na rôzne spôsoby, ako môžeme zoradiť zoznam v C #.

Poznámka - Ak chcete používať zoznamy v jazyku C #, vrátane knižnice System.Collections.Generic.

a. Použitie predvoleného porovnávača

Toto je predvolená metóda sort (). ak do metódy nie je výslovne uvedený žiadny porovnávací program, použije c # na usporiadanie prvkov vzostupné poradie.

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ýkon:

b. Použitie vlastného porovnávača

Môžeme tiež poskytnúť náš vlastný porovnávací spôsob s metódou sort (). To by inštruovalo kompilátor c #, aby namiesto vlastného predvoleného porovnávača použil vlastný porovnávač.

Na vytvorenie vlastného porovnávača je potrebné implementovať metódu Compare () z rozhrania IComparer. Nasledujúci kód ukazuje, ako vytvoriť porovnávač, ktorý by usporiadal prvky v zostupnom poradí.

Vytvorili sme triedu, zdedili ju z rozhrania IComparer, implementovali metódu Compare () a prehodnotili ju, aby sme porovnali prvky v zostupnom poradí.

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ýkon:

Triedenie typov zložitých zoznamov

Typy zložitých zoznamov sú zoznamy definované používateľom. Presnejšie povedané, sú to zoznamy objektov užívateľsky definovaných tried. Tieto objekty sú definované používateľom a sú kombináciou rôznych primitívnych typov. Je zložité usporiadať zložitý typ zoznamu. Kompilátor C # očakáva, že každá komplexná trieda zdedí po rozhraní IComparable a definuje metódu CompareTo (). Táto metóda obsahuje pokyny na porovnanie prvkov zoznamu na triedenie.

V nasledujúcom príklade definujeme užívateľom definovanú triedu Zamestnanci a triedime objekty Zamestnanci podľa ich ID.

Prí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ýkon:

Teraz je zrejmé, že si treba uvedomiť, že čo ak chceme triediť objekty triedy Zamestnanci na základe iného majetku? To je možné. Potrebovali by sme implementovať rozhranie IComparer. Pozrime sa na príklad uvedený nižšie, aby sme pochopili.

Prí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ýkon:

záver

Tento článok sa teda podrobne venoval tomu, ako triediť zbierky v jazyku C #. Zamerali sme sa hlavne na polia a zoznamy, pretože tieto dva zahŕňajú aj všetky primitívne typy. Akonáhle je koncepcia triedenia v C # veľmi dobre pochopená, je ľahké implementovať triedenie v iných kolekciách, ako sú enumerácie, slovníky atď. Po dokončení tohto článku sa odporúča preskúmať dokumentáciu MSDN, kde nájdete ďalšie implementácie triedenia v C #.

Odporúčané články

Toto je sprievodca triedením v jazyku C #. Tu diskutujeme výkonnosť triedenia, typy triedenia, ako napríklad pole a zoznam, spolu s príkladmi a implementáciou kódu. Ďalšie informácie nájdete aj v nasledujúcich článkoch -

  1. Objekty v C #
  2. Modifikátory prístupu v jazyku C #
  3. Triedenie bubliniek v Jave
  4. Ukazovatele v C #
  5. Triedenie v Pythone
  6. String Array v JavaScripte
  7. Porovnateľné v príklade Java Rozhranie kolekcie v jazyku Java
  8. Strings Array in C with Functions
  9. Rôzne príklady zbierok v jazyku C #

Kategórie: